Есть ли у нас логические операторы короткого замыкания в сценарии оболочки C? - PullRequest
2 голосов
/ 12 сентября 2010

Я думал, что сценарий оболочки C будет вести себя как C и использовать оценку короткого замыкания для логических операторов.

if ((! -e $cache ) || ("`find $monitor -newer $cache`" != "")) then
...
endif

Но в операторе if, даже если первое условие верно, второе проверяется, давая мнеошибки.

Имеется ли логическое ИЛИ короткого замыкания в сценарии оболочки C?

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Да, && и || - операторы короткого замыкания в tcsh (как и в C).И есть две разные формы, одна из которых работает с командами (как в false && echo foo), а другая - с выражениями (как в if (-e $file1 && -e $file2)).

Я не совсем уверен, что здесь происходитза исключением того, что csh и tcsh печально известны нечетким синтаксисом.Немного экспериментов показывает, что сохранение вывода find в переменной позволяет избежать ошибки:

set s = "`find $monitor -newer $cache`"
if ((! -e $cache) || ("$s" != "")) then
    echo ok
endif

(обратите внимание, что дополнительные скобки на самом деле не нужны, но они ничего не повредят.)

Но возможны дальнейшие улучшения.Сохранять весь вывод команды find в переменной не обязательно.Вместо этого вы можете вызывать функцию поиска и использовать возвращенный статус, чтобы сказать вам, нашел ли он что-либо:

Я только что попробовал это:

if (! -e $cache || { find $monitor -newer $cache >& /dev/null } ) then
    echo ok
endif

, и это сработало - за исключением того, что >& /dev/nullперенаправление, по-видимому, игнорируется внутри фигурных скобок.

Вместо этого вы можете выполнить команду «найти» отдельно, а затем проверить полученный $ статус.Это означает, что вы теряете преимущество оператора короткого замыкания ||;вам придется прибегнуть к вложенным if операторам и / или временным переменным.

Возможно, реальный урок заключается в следующем: я использую csh и tcsh больше лет, чем хочу признать, иединственный способ, которым я смог выяснить многое из этого, был методом проб и ошибок.Вы можете сделать это с помощью tcsh или csh, но вам, вероятно, лучше использовать другой язык сценариев.Например, в оболочке Bourne это довольно просто:

if [ ! -e $cache ] || find $monitor -newer $cache >/dev/null 2>&1 ; then
    ...
fi
1 голос
/ 12 сентября 2010

Обычно && и || являются короткозамкнутыми. Рассмотрим что-то вроде этого:

$ false && echo foo
$ true || echo foo

В обоих случаях foo не будет выпущен.

Но, AFAIK, вы не можете использовать такой тип сравнения строк, как этот, даже если короткое замыкание, csh все равно будет проверять синтаксис.

...