Bash zachowuje się w nieco niestandardowy sposób -
.
POSIX mówi:
Wytyczna 10:
Pierwszy --
argument, który nie jest argumentem opcji, powinien zostać zaakceptowany jako separator wskazujący koniec opcji. Wszelkie poniższe argumenty należy traktować jak operandy, nawet jeśli zaczynają się od -
znaku.
[…]
Wytyczna 13:
W przypadku narzędzi, które używają argumentów do reprezentowania plików, które mają zostać otwarte w celu odczytu lub zapisu, -
należy używać tego argumentu tylko w przypadku standardowego wejścia (lub standardowego wyjścia, gdy z kontekstu wynika, że określono plik wyjściowy) lub plik o nazwie -
.
I
W przypadku gdy narzędzie opisane w tomie Shell and Utilities POSIX.1-2017 jako zgodne z niniejszymi wytycznymi jest wymagane do zaakceptowania lub nieakceptowania argumentu -
oznaczającego standardowe wejście lub wyjście, użycie to wyjaśniono w sekcji OPERANDS. W przeciwnym razie, jeśli takie narzędzie używa operandów do reprezentowania plików, określa się implementację, czy operand -
oznacza standardowe wejście (lub standardowe wyjście), czy plik o nazwie -
.
Ale potem man 1 bash
czyta:
A --
sygnalizuje koniec opcji i wyłącza dalsze przetwarzanie opcji. Wszelkie argumenty występujące po --
są traktowane jako nazwy plików i argumenty. Argument -
jest równoważny z --
.
Tak więc dla Bash -
nie oznacza ani standardowego wejścia, ani pliku, stąd nieco niestandardowy.
Teraz twój konkretny przypadek:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
I podejrzewam, autor tego polecenia nie może zrozumieć, -
jest równoważne --
w tej sprawie. I podejrzewam, autor chciał się upewnić, bash
będzie czytać ze standardowego wejścia, ale oczekuje -
się pracy zgodnie z wytyczną 13.
Ale nawet gdyby działało zgodnie z wytycznymi, -
byłoby tutaj niepotrzebne, ponieważ bash
wykrywa, kiedy jego standardowym wejściem jest potok i działa odpowiednio (chyba że -c
podano itp.).
Jednak -
nie działa zgodnie z wytycznymi, działa jak --
. Nadal --
jest tutaj niepotrzebny, ponieważ po nim nie ma żadnych argumentów.
Moim zdaniem ostatnie -
nic nie zmienia. Polecenie działałoby bez niego.
Aby zobaczyć, jak --
i -
może być ogólnie użyteczne, przestudiuj poniższy przykład.
cat
w moim Kubuntu przestrzega obu wytycznych i użyję go do wykazania przydatności -
i --
.
Pozwól plikowi o nazwie foo
istnieć. Spowoduje to wydrukowanie pliku:
cat foo
Pozwól plikowi o nazwie --help
istnieć. Nie spowoduje to wydrukowania pliku:
cat --help
Ale spowoduje to wydrukowanie pliku o nazwie --help
:
cat -- --help
Spowoduje to konkatenację pliku o nazwie --help
z tym, co pochodzi ze standardowego wejścia:
cat -- --help -
Wygląda na to, że tak naprawdę nie potrzebujesz --
, ponieważ zawsze możesz przekazać, ./--help
co z pewnością zostanie zinterpretowane jako plik. Ale zastanów się
cat "$file"
gdy nie wiesz z góry, jaka jest zawartość zmiennej. Nie możesz po prostu się ./
do tego przyłączyć , ponieważ może to być ścieżka absolutna i ./
mogłaby ją złamać. Z drugiej strony może to być plik o nazwie --help
(bo dlaczego nie?). W tym przypadku --
jest bardzo przydatny; jest to o wiele bardziej niezawodne polecenie:
cat -- "$file"