Синтаксис Linux Bash: значение &&, \, и -

14

Что означают ' &&', ' \' и ' -' в конце команд bash?

В частности, я столкнулся со следующей комбинацией строк, которые должны добавить открытые ключи в менеджер пакетов aptitude в Ubuntu, для чего эти символы используются здесь?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update
Alex
источник
«/» - это не то же самое, что «\»
Томас
Томас: исправил свой пост
Кайл Брандт
Обратные слеши здесь не нужны, так как && также будет достаточно для продолжения строки. Однако использование обратной косой черты способствует удобочитаемости.
Приостановлено до дальнейшего уведомления.

Ответы:

37

«&&» используется для объединения команд таким образом, что следующая команда запускается тогда и только тогда, когда предыдущая команда завершилась без ошибок (или, точнее, выйдет с кодом возврата 0).

«\» само по себе в конце строки является средством объединения строк вместе. Итак, следующие две строки:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

обрабатываются точно так же, как если бы строка была написана как одна строка:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

«-» - это аргумент командной строки без конкретной функции bash. Как именно он обрабатывается, зависит от выполняемой команды (в данном случае apt-key ). В зависимости от контекста, он обычно используется для указания либо « читать данные из стандартного ввода, а не из файла », либо « обрабатывать оставшуюся часть строки как данные, а не как аргументы командной строки ».

goldPseudo
источник
5
В этом случае «-» - это не параметр sudo, а «apt-key», что означает, что вместо ключевого файла «apt-key» использует данные, поступающие по каналу («|») на его стандартный вывод. в качестве ключа. Опция «gpg --export», не имея «--output a_file_name.key», выдвигает новый ключ из стандартного ввода gpg через канал ('|') к стандартному вводу 'apt-key'. Easy: - )
Эдомавр
2
возгласы. это то, что я получаю за ответы на вопросы в полусне. фиксированный.
goldPseudo
7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)
rodjek
источник
6

&& - это логическое И:
&& - это способ выражения логического И , то есть все выражение истинно, только если обе его стороны истинны. В логике говорят, что все утверждение (P & Q) верно только тогда, когда оба P и Q верны.

Как следствие этого, компьютеры обычно рассматривают P & Q как оценку короткого замыкания . Таким образом, поскольку весь оператор будет истинным, только если оба параметра P и Q истинны, то, если P ложен, оператор Q не оценивается . В основном компьютеры ленивы (эффективны), и не стоит оценивать Q, если у них их тоже нет. Это также верно для логического ИЛИ, см. Предыдущую ссылку.

Три контекста && в Bash:

1) Использование оценки короткого замыкания со статусом выхода команды:
каждая команда имеет статус выхода. Если команда имеет ошибку, она имеет ненулевой статус завершения. Таким образом, если статус выхода не равен нулю и && используется для объединения команд в оператор, более поздние команды не будут оцениваться (выполняться), если предыдущая команда не имела статуса выхода 0 (True). Это из-за оценки короткого замыкания. Так что если у вас есть:

P && Q

Q не будет выполняться, если P не было истинным (если P выходит со статусом чего-либо, кроме 0, это не так). Так же, как:

./configure && make

make не будет выполнен, если в configure произошла ошибка, значение true. Таким образом, в конечном итоге, в конце концов, это способ написать заявление if then:

if ./configure ; then
   make
fi

Имейте в виду, что в большинстве случаев 0 равно false, но не когда дело доходит до статуса выхода.

2) && Может использоваться в встроенной тестовой команде Bash [[]]:

&& Может также использоваться внутри встроенной команды тестирования в bash [[]] для объединения выражений аналогично объединению команд. Вся тестовая операция будет истинной, только если оба операнда (стороны) && верны, например:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

было бы способом сказать, если $ a является целым числом от 2 до 5 (не включая 2 и 5).

3) Арифметическая оценка:

Наконец, && может использоваться в арифметической оценке как Логическое И. Если оба (логическое И) чисел в следующем не ненулевые, он возвращает 0, иначе возвращается 1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
Кайл Брандт
источник
@Kyle: && вне логического выражения используется оператор управления И, похожее поведение, но технически другое
drAlberT
Не следуйте вашему комментарию, что вы подразумеваете под логическим выражением?
Кайл Брандт
Я имею в виду, что в выражении оператор && control принимает среднее значение «логическое и», в противном случае это только «и». Это «оператор управления И», используемый в списках. логические операторы используются в контексте арифметического расширения, в выражениях.
drAlberT
в if [./configure] примере вы должны снять скобки. Правильноif ./configure; then make...
Джулиано
Juliano, Хороший улов, обновлю. AlberT, есть ли какая-то разница, кроме терминов, которые даны в man-страницах?
Кайл Брандт
3

Я думаю, что вы будете лучше с объяснением «реального» значения, последствия это другое дело :)

  • && является оператором управления «И». От Bash Man :
    Операторы управления && и || обозначают списки AND и OR соответственно.
    Список AND имеет вид  
        command1 && command2     
    Команда2 выполняется тогда и только тогда, когда команда1 возвращает нулевое состояние выхода.
    [..порез..]
    Статус возврата списков AND и OR является статусом выхода последней команды
    выполнено в списке.
    
    Оператор управления является
    Токен, выполняющий функцию управления. Это один из следующих символов:
        || & &&; ;; () |
    
  • \это « escape-символ », и это один из трех механизмов цитирования, доступных в bash:
    квотирование
       Цитирование используется для удаления специального значения определенных символов или слов в оболочке.
    [..порез..]
       Существует три механизма цитирования: escape-символ, одинарные кавычки и двойные кавычки.
       Обратная косая черта без кавычек (\) является escape-символом. Он сохраняет буквальное значение следующего символа, за исключением. Если появляется \ pair, а обратная косая черта сама по себе не заключена в кавычки, \ рассматривается как продолжение строки (то есть она удаляется из входного потока и фактически игнорируется).
    [..порез..]
    Обратная косая черта сохраняет свое специальное значение только тогда, когда за ней следует один из следующих символов: $, `,", \ или.
    
    Это означает, что если вы поместите escape-символ ("\") в самом конце строки, вы фактически будете избегать нового символа строки, который следует сразу за ним (RETURN char), таким образом, получая эффект "продолжить строку" другие уже объяснили в своем ответе
  • Символ тире " - ", который некоторые команды принимают в качестве параметра, является соглашением, а не специальным символом или оператором оболочки. Как уже отмечалось, это своего рода метка места для стандартных потоков ввода / вывода. В зависимости от программы, на которую мы ссылаемся, она может оставаться для стандартного ввода (стандартный ввод) или стандартного вывода (стандартный вывод).

Мои 2 цента

drAlberT
источник
1
Вероятно, будет случай с т. Д. Вставка гигантских кусков man-страницы - как бы просветляющей она ни была - вероятно, просто запугает ОП.
Роджек