Да, &&
и ||
- операторы короткого замыкания в 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