Що означає останній знак "-" (дефіс) у варіантах "bash"?


15

У цьому підручнику нам потрібно виконати таку команду:

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

Що означає останній -(дефіс) після bash?

Я бачив багато команд із цим, і не міг знайти собі логічного пояснення і не знайшов, як переформулювати пошук в Google. Це вихід з трубопровідної команди?



2
Завантаження матеріалів з мережі та передавання їх безпосередньо на sudo bashзвуки дійсно страшно. Спробуйте знайти підручник, який не заохочує подібні практики.
hmakholm залишився над Монікою

Підручник з npm, але я з вами згоден ...
Омар БІСТАМІ

1
Якщо вам потрібно шукати речі з символами в них, спробуйте symbolhound.com.
Джо

Відповіді:


31

Баш поводиться дещо нестандартно, коли йдеться про це -.

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"

6

У man bashкінці опцій однозначного символу є:

--    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 --.

Якщо ви цитували повну команду, я не бачу причин використовувати -після bashцього в цьому випадку, але це не шкодить.


Дякую за вашу відповідь, так, я цитував повну команду. тож нічого після - або - не буде розглядатися як варіант, але як ім'я файлу або аргументи, ви можете, будь ласка, навести приклад, де це корисно?
Омар БІСТАМІ

1
Дійсно, щоб сценарій, ім'я якого починається -, малоймовірне, але -/ --робить це можливим.
AFH

1
@OmarBISTAMI Цитування команди вплине на те, як оболонка розширює її, але не вплине на жоден з аргументів, які слідують за нею. Якщо ви розширите лапки навколо законних аргументів, вони стають частиною імені команди, яке теж не те, що вам потрібно. Є деякі команди, які беруть назви файлів як аргументи, але не використовують стандартні введення за замовчуванням. Надуманий приклад дозволяє провести сендвіч-вхід (з терміналу або труби) між двома файлами. cat file1 - file2 > file3.
Джо

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash -означає, що bashчекає stdin. Так практично bash буде виконувати все, що повертається командою, що знаходиться зліва від|

Подібний, але простіший приклад може бути:

echo hello | cat - тут catнадрукуємо "привіт". Чому? Тому що "привіт" надсилається коту через |і catчекає, що все йому надішле

Тепер розбимо всю команду на два:

curl -sL https://rpm.nodesource.com/setup_6.x

ця команда curl поверне щось, що можна зрозуміти і виконати bash

то у нас є труба, |яка відправить результат, повернений командою curl, в праву частину труби, тобто sudo -E bash -. Нарешті в sudo -E bash -, Баш готовий виконати все, що йому направлено

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.