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


14

Що означають ' &&', ' \' і ' -' в кінці команд bash?

Зокрема, я натрапив на таке поєднання рядків, які повинні додавати відкриті ключі до менеджера можливостей пакету Ubuntu, для чого використовуються ці символи?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \ \
    gpg --export --armor 26C2E075 | додаток sudo apt-key - && \
    sudo apt-get update

"/" не те саме, що "\"
Томас

Томас: виправив свою посаду
Кайл Брандт

Нахили в нижній частині риси тут не потрібні, оскільки && також буде достатньо, щоб передбачити продовження лінії Однак використання косої риски сприяє читанню.
Призупинено до подальшого повідомлення.

Відповіді:


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 ). Залежно від контексту, він зазвичай використовується для позначення або " читання даних з stdin, а не з файлу ", або " обробляти решту рядка як дані, а не як аргументи командного рядка ".


5
У цьому випадку '-' не є параметром sudo, а 'apt-key', це означає, що замість файлу ключа 'apt-ключ' використовує дані, що надходять через трубу ('|') до його stdin як ключ. Параметр "gpg --export", не маючи "--output a_file_name.key", висуньте нову клавішу з gd stdout, через трубу ('|') до stdin "apt-ключа" Easy: - )
edomaur

2
оні. ось що я отримую за відповіді на запитання під час засинання. фіксований.
золотоПсевдо

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)

6

&& - це логічно AND:
&& - це спосіб вираження логічного AND , тобто весь вираз є Істинним, лише якщо обидві його сторони є істинними. За логікою кажуть, що все твердження (P&Q) є істинним лише тоді, коли і P, і Q є істинними.

Як наслідок цього, комп'ютери зазвичай розглядають P&Q як оцінку короткого замикання . Отже, оскільки весь вислів буде істинним лише в тому випадку, якщо І P, і Q є істинними, і якщо P неправдиво, твердження Q не оцінюється . В основному комп'ютери ледачі (ефективні) і не переймаються оцінкою Q, якщо їх теж немає. Це також стосується логічного АБО, дивіться попереднє посилання.

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

1) Використання Оцінки короткого замикання зі статусом виходу команди:
Кожна команда має статус виходу. Якщо команда має помилку, вона має статус виходу, який не дорівнює нулю. Отже, якщо статус виходу не дорівнює нулю, а && використовується для з'єднання команд разом у оператор, пізніші команди не будуть оцінені (виконані), якщо попередня не мала статусу виходу 0 (True). Це відбувається через оцінку короткого замикання. Тож якщо у вас є:

P && Q

Q не буде виконуватися, якщо P не був істинним (якщо P виходить зі статусом нічого, крім 0, це неправда). Так само, як:

./configure && make

make не буде виконуватися, якщо в налаштуваннях була помилка, не було правдою. Таким чином, в кінцевому підсумку це спосіб запису, якщо тоді висловлювання:

if ./configure ; then
   make
fi

Майте на увазі, тоді в більшості контекстів 0 є помилковим, але це не стосується статусу виходу.

2) && Може бути використаний у вбудованій [[]] тестовій команді Bash:

&& Може також використовуватися всередині вбудованої тестової команди в bash [[]] для комбінування виразів аналогічно, як комбінування команд. Вся тестова операція буде істинною, лише якщо обидва операнди (сторони) && є істинними, наприклад:

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

було б способом сказати, якщо $ a - ціле число між 2 і 5 (не враховуючи 2 і 5).

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

Нарешті, && може використовуватися в арифметичній оцінці як логічне AND. Якщо обидва (логічне І) чисел у наведеному нижче значенні не дорівнює нулю, він повертає 0, а інше повертається 1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle: &&, що використовується поза логічним виразом, - це "І оператор управління", схожа поведінка, але технічно інша
drAlberT

Не слідкуйте за своїм коментарем, що ви маєте на увазі поза логічним виразом?
Кайл Брандт

Я маю на увазі, що в виразі оператор && управління приймає середнє значення "логічне і", інакше це лише "і". Це "оператор управління" та використовується в списках. логічні оператори використовуються в контексті арифметичного розширення, в межах виразів.
drAlberT

у if [./configure]прикладі слід зняти дужки. Правильноif ./configure; then make...
Джуліано

Джуліано, Хороший улов, оновиться. AlberT, чи є якась різниця, крім термінів, які надають сторінки чоловіка?
Кайл Брандт

3

Я думаю, вам краще буде пояснити "реальний" сенс, наслідки - інша річ :)

  • && - оператор управління "І". Від баш людини :
    Оператори управління && та || позначають списки AND і списки АБО відповідно.
    Список І має форму  
        command1 && command2     
    command2 виконується, якщо і тільки тоді, command1 повертає статус виходу в нуль.
    [..різати ..]
    Статус повернення списку AND і OR - це стан виходу останньої команди
    виконаний у списку.
    
    Оператор управління є
    Маркер, який виконує керуючу функцію. Це один із наступних символів:
        || & &&; ;; () |
    
  • \є " символом втечі ", і це один з трьох механізмів цитування, доступних у bash:
    ЦИТУВАННЯ
       Цитування використовується для видалення спеціального значення певних символів або слів до оболонки.
    [..різати ..]
       Існує три механізми цитування: символ втечі, одиничні лапки та подвійні лапки.
       Зворотний проріз, який не котирується (\), є символом втечі. Тут зберігається буквальне значення наступного символу, що випливає, за винятком. Якщо з'являється пара \, а зворотна косої риски не є самою цитованою, \ трактується як продовження рядка (тобто він видаляється з вхідного потоку та фактично ігнорується).
    [..різати ..]
    Нахил нахилу зберігає своє особливе значення лише тоді, коли за ним слідує один з наступних символів: $, `,", \ або.
    
    Це означає, що якщо ви поставите символ втечі ("\") в самому кінці рядка, ви насправді уникаєте нового символьного рядка, який негайно слідує за ним (char RETURN), таким чином маючи ефект "продовжити рядок" інші вже пояснили у своїй відповіді
  • Тире " - ", яке деякі команди приймають за параметр, є умовою, а не спеціальним символом оболонки або оператором. Як вже було зазначено, це свого роду маркер місця для стандартних потоків вводу / виводу. Залежно від програми, до якої ми посилаємось, вона може залишатися для stdin (стандартний вхід) або stdout (стандартний вихід).

Мої 2 копійки


1
Можливо, це буде справа тл; д-ра. Наклеювання гігантських шматочків manpage - настільки просвітницьких - це, ймовірно, просто залякає OP.
rodjek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.