2016-11-30 9 views
1

var=foo && echo $var При выполнении в Башпроцесс выполнения команды с «&&»

результат будет: foo

Означает ли это, $var расширяется после var=foo выполняется? Я хочу понять этот процесс.

+3

'' && является и оператором. IF слева, чтобы '&&' был истинным или завершен успешно, тогда право на '&&' будет выполнено. –

+0

Я сделал некоторые улучшения грамматики – mkj

ответ

0

Работы bash тесно связаны с работой языка программирования C.

&&является короткозамкнутый (как в С). И, как и C, аргумент в правой части &&: не оценивается до тех пор, пока оценка левой стороны не завершится. (Формально в С мы говорим, что && является последовательность точки.)

Так echo $var является только расширен один раз (я) var=foo вычисляется и (II), если он имеет значение значения, которое принуждает к 0 (который означает успех).

+0

Вы имеете в виду значение, которое приводит к 0 :) в bash, 0 истинно, 1 (или больше) является ошибкой. Написание true/false будет более ясным. – Aserre

+2

0 - * успех *, отличное от нуля - * неисправность *. Это вызывает больше проблем, чем позволяет избежать попытки постоянно думать о них как о логических значениях. – chepner

+1

@chepner: Спасибо за это. Я забыл и вспомнил, что по крайней мере дважды ;-) – Bathsheba

0

Да, это так. Как правило, следующая комбинация из двух команд:

cmd1 && cmd2 

означает, что выполнение cmd2 если выполнение cmd1 успешно.

1

См bash manual, который гласит:

И и ИЛИ списки последовательности из одного или нескольких конвейеров, разделенных & & и || соответственно. И и OR имеют , выполненные с левой ассоциативностью. элемент И список имеет вид

 command1 && command2 

command2 выполняется тогда и только тогда, когда command1 возвращает статус выхода нуля.

(курсив мой)

Это означает, что echo $var будет выполняться только тогда, когда операция присваивания (var=foo) была успешной.

Это эквивалентно:

var=foo 
if [[ $? -eq 0 ]]; then 
    echo $var 
fi