Баш поводиться дещо нестандартно, коли йдеться про це -
.
POSIX говорить:
Настанова 10:
Перший --
аргумент, який не є аргументом-опціоном, повинен прийматися як роздільник, що вказує на кінець параметрів. Будь-які наступні аргументи слід розглядати як операнди, навіть якщо вони починаються з -
символу.
[…]
Вказівка 13:
Утиліти, які використовують операнди для представлення файлів, відкритих для читання чи запису, -
операнд повинен використовуватися для позначення лише стандартного вводу (або стандартного виводу, коли з контексту зрозуміло, що задається вихідний файл) або файл з іменем -
.
І
Якщо утиліта, описана в томі Shell and Utilities POSIX.1-2017 як така, що відповідає цим керівництву, вимагає прийняти або не прийняти операнд -
для позначення стандартного вводу або виводу, це використання пояснюється в розділі OPERANDS. В іншому випадку, якщо така утиліта використовує операнди для представлення файлів, вона визначається реалізацією, чи -
означає операнд стандартний вхід (або стандартний вихід), або файл з ім'ям -
.
Але потім man 1 bash
читає:
--
Сигналізує про закінчення опцій і відключає опцію подальшої обробки. Будь-які аргументи після цього --
трактуються як імена та аргументи. Аргумент -
рівносильний --
.
Тож для Bash -
не означає ні стандартного вводу, ні файлу, отже, дещо нестандартного.
Тепер ваш конкретний випадок:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
Я підозрюю, що автор цієї команди може не усвідомлювати -
, що --
в цьому випадку рівнозначно . Я підозрюю, що автор хотів переконатися, що bash
прочитає його зі стандартного введення, і, як вони очікували, -
буде працювати відповідно до настанови 13.
Але навіть якби це працювало згідно з настановою, тут -
було б непотрібно, оскільки він bash
виявляє, коли його стандартним входом є труба, і діє відповідно (якщо -c
не вказано тощо).
Але -
не працює згідно з настановою, це працює так --
. Тут все-таки --
непотрібно, оскільки аргументів після цього немає.
На мій погляд, останні -
нічого не змінюють. Команда спрацювала б і без неї.
Щоб побачити, як --
і як -
може бути корисно в цілому, вивчіть приклад нижче.
cat
в моєму Kubuntu дотримується обох вказівок, і я буду використовувати його для демонстрації корисності -
та --
.
Нехай файл з назвою foo
існує. Це надрукує файл:
cat foo
Нехай файл з назвою --help
існує. Цей файл не буде надруковано:
cat --help
Але це буде надрукувати файл з назвою --help
:
cat -- --help
Це з'єднає файл, названий --help
тим, що відбувається зі стандартного вводу:
cat -- --help -
Здається, вам насправді не потрібно --
, тому що ви завжди можете передати те, ./--help
що буде інтерпретуватися як файл точно. Але врахуйте
cat "$file"
коли ви заздалегідь не знаєте, що таке зміст змінної. Ви не можете просто ./
передбачити його, тому що це може бути абсолютний шлях і ./
зламає його. З іншого боку, це може бути файл з назвою --help
(бо чому б ні?). У цьому випадку --
дуже корисно; це набагато надійніша команда:
cat -- "$file"