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 bashczyta:
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ć, bashbę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ż bashwykrywa, kiedy jego standardowym wejściem jest potok i działa odpowiednio (chyba że -cpodano 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.
catw moim Kubuntu przestrzega obu wytycznych i użyję go do wykazania przydatności -i --.
Pozwól plikowi o nazwie fooistnieć. Spowoduje to wydrukowanie pliku:
cat foo
Pozwól plikowi o nazwie --helpistnieć. Nie spowoduje to wydrukowania pliku:
cat --help
Ale spowoduje to wydrukowanie pliku o nazwie --help:
cat -- --help
Spowoduje to konkatenację pliku o nazwie --helpz tym, co pochodzi ze standardowego wejścia:
cat -- --help -
Wygląda na to, że tak naprawdę nie potrzebujesz --, ponieważ zawsze możesz przekazać, ./--helpco 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"