Назад | Перейти на главную страницу

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

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

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

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update

"&&" используется для объединения команд в цепочку, так что следующая команда выполняется тогда и только тогда, когда предыдущая команда завершилась без ошибок (или, точнее, завершилась с кодом возврата 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). В зависимости от контекста он обычно используется для обозначения "читать данные из стандартного ввода, а не из файла", или "обрабатывать оставшуюся часть строки как данные, а не как аргументы командной строки".

&& == 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)

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

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

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

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

P && Q

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

./configure && make

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

if ./configure ; then
   make
fi

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

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

Думаю, вам лучше объяснит "настоящий" смысл, другое дело - подтекст :)

  • && - управляющий оператор «И». Из bash man:
    The control operators && and || denote AND lists and OR lists, respectively.
    An AND list has the form  
        command1 && command2     
    command2 is executed if, and only if, command1 returns an exit status of zero.
    [..cut..]
    The return status of AND and OR lists is the exit status of the last command
    executed in the list.
    
    А оператор управления является
    A token that performs a control function.  It is one of the following symbols:
        || & && ; ;; ( ) | 
    
  • \ это "escape-символ", и это один из трех механизмов цитирования, доступных в bash:
    QUOTING
       Quoting is used to remove the special meaning of certain characters or words to the shell.
    [..cut..]
       There are three quoting mechanisms: the escape character, single quotes, and double quotes.
       A  non-quoted  backslash (\) is the escape character.  It preserves the literal value of the next character that follows, with the exception of .  If a \ pair appears, and the backslash is not itself quoted, the \ is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).
    [..cut..]
    The backslash retains its special meaning only when followed by one of the following characters: $, `, ", \, or .
    
    Это означает, что если вы поместите escape-символ ("\") в самый конец строки, вы фактически экранирование символа новой строки который сразу следует за ним (символ RETURN), таким образом, имея эффект «продолжить линию», другие уже объяснили в своем ответе
  • Знак черты "-", который некоторые команды принимают в качестве параметра, является соглашением, а не специальным символом или оператором оболочки. Как уже отмечалось другими, это своего рода маркер места для стандартных потоков ввода-вывода. В зависимости от программы, на которую мы ссылаемся, он может оставайтесь для stdin (стандартный ввод) или stdout (стандартный вывод).

Мои 2 цента