var=foo && echo $var
При выполнении в Башпроцесс выполнения команды с «&&»
результат будет: foo
Означает ли это, $var
расширяется после var=foo
выполняется? Я хочу понять этот процесс.
var=foo && echo $var
При выполнении в Башпроцесс выполнения команды с «&&»
результат будет: foo
Означает ли это, $var
расширяется после var=foo
выполняется? Я хочу понять этот процесс.
Работы bash тесно связаны с работой языка программирования C.
&&
является короткозамкнутый (как в С). И, как и C, аргумент в правой части &&
: не оценивается до тех пор, пока оценка левой стороны не завершится. (Формально в С мы говорим, что &&
является последовательность точки.)
Так echo $var
является только расширен один раз (я) var=foo
вычисляется и (II), если он имеет значение значения, которое принуждает к 0 (который означает успех).
Вы имеете в виду значение, которое приводит к 0 :) в bash, 0 истинно, 1 (или больше) является ошибкой. Написание true/false будет более ясным. – Aserre
0 - * успех *, отличное от нуля - * неисправность *. Это вызывает больше проблем, чем позволяет избежать попытки постоянно думать о них как о логических значениях. – chepner
@chepner: Спасибо за это. Я забыл и вспомнил, что по крайней мере дважды ;-) – Bathsheba
Да, это так. Как правило, следующая комбинация из двух команд:
cmd1 && cmd2
означает, что выполнение cmd2
если выполнение cmd1
успешно.
См bash manual, который гласит:
И и ИЛИ списки последовательности из одного или нескольких конвейеров, разделенных & & и || соответственно. И и OR имеют , выполненные с левой ассоциативностью. элемент И список имеет вид
command1 && command2
command2 выполняется тогда и только тогда, когда command1 возвращает статус выхода нуля.
(курсив мой)
Это означает, что echo $var
будет выполняться только тогда, когда операция присваивания (var=foo
) была успешной.
Это эквивалентно:
var=foo
if [[ $? -eq 0 ]]; then
echo $var
fi
'' && является и оператором. IF слева, чтобы '&&' был истинным или завершен успешно, тогда право на '&&' будет выполнено. –
Я сделал некоторые улучшения грамматики – mkj