Bash se chová poněkud nestandardně, pokud jde o -
.
POSIX říká:
Pravidlo 10:
První--
argument, který není opčním argumentem, by měl být přijat jako oddělovač označující konec opcí. Všechny následující argumenty by měly být považovány za operandy, i když začínají-
postava.[…]
Pravidlo 13:
U nástrojů, které používají operandy k reprezentaci souborů, které mají být otevřeny pro čtení nebo zápis,-
operand by měl být použit k označení pouze standardního vstupu (nebo standardního výstupu, pokud je z kontextu jasné, že je specifikován výstupní soubor) nebo souboru s názvem-
.
A
Tam, kde se vyžaduje, aby utilita popsaná ve svazku Shell and Utilities POSIX.1-2017 jako vyhovující těmto pokynům přijala nebo nepřijala operand
-
pro standardní vstup nebo výstup je toto použití vysvětleno v části OPERANDY. V opačném případě, pokud takový nástroj používá k reprezentaci souborů operandy, je implementací definováno, zda operand-
znamená standardní vstup (nebo standardní výstup) nebo soubor s názvem-
.
Ale pak man 1 bash
zní:
A
--
signalizuje konec možností a zakáže další zpracování možností. Jakékoli argumenty za--
jsou považovány za názvy souborů a argumenty. Argument-
je ekvivalentní--
.
Tedy pro Bash -
neznamená ani standardní vstup, ani soubor, tedy poněkud nestandardní.
Nyní váš konkrétní případ:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Mám podezření autor tohoto příkazu si nemusí uvědomit -
je ekvivalentní --
v tomto případě. Mám podezření autor se chtěl ujistit bash
bude číst ze svého standardního vstupu, očekávali -
pracovat podle směrnice 13.
Ale i kdyby to fungovalo podle pokynů, -
by zde bylo zbytečné, protože bash
zjistí, kdy je jeho standardním vstupem potrubí, a podle toho se chová (pokud není -c
je dáno atd.).
Přesto -
nefunguje podle pokynů, funguje jako --
. Stále --
je zde zbytečné, protože za ním nejsou žádné argumenty.
Podle mého názoru poslední -
nic nemění. Příkaz by fungoval i bez něj.
Chcete-li zjistit, jak --
a -
může být užitečné obecně, prostudujte si níže uvedený příklad.
cat
v mém Kubuntu se řídí oběma pokyny a použiji je k prokázání užitečnosti -
a --
.
Nechte soubor s názvem foo
existovat. Toto vytiskne soubor:
cat foo
Nechte soubor s názvem --help
existovat. Toto nevytiskne soubor:
cat --help
Tím se ale vytiskne soubor s názvem --help
:
cat -- --help
Tím se zřetězí soubor s názvem --help
s čímkoli, co pochází ze standardního vstupu:
cat -- --help -
Zdá se, že --
ve skutečnosti nepotřebujete , protože vždy můžete předat ./--help
který bude pro jistotu interpretován jako soubor. Ale zvažte
cat "$file"
když předem nevíte, jaký je obsah proměnné. Nemůžete předřadit ./
k němu, protože to může být absolutní cesta a ./
zlomilo by to. Na druhou stranu může být soubor s názvem --help
(protože proč ne?). V tomto případě --
je velmi užitečné; toto je mnohem robustnější příkaz:
cat -- "$file"
V man bash
, na konci jednoznakových možností je:-
-- A -- signals the end of options and disables further option processing.
Any arguments after the -- are treated as filenames and arguments. An
argument of - is equivalent to --.
Pokud jste citovali celý příkaz, nevidím důvod pro použití -
po bash
v tomto případě, ale neškodí.