Scripting 在C shell脚本中是否有短路逻辑运算符?

Scripting 在C shell脚本中是否有短路逻辑运算符?,scripting,shell,csh,tcsh,short-circuiting,Scripting,Shell,Csh,Tcsh,Short Circuiting,我认为C shell脚本的行为将类似于C,并对逻辑运算符使用短路求值 if ((! -e $cache ) || ("`find $monitor -newer $cache`" != "")) then ... endif 但是在if语句中,即使第一个条件为true,第二个条件也会被检查,并给出错误 我们是否有短路逻辑或C shell脚本?通常,&&和|都是短路。考虑这样的事情: $ false && echo foo $ true || echo foo 在这两种情况下,

我认为C shell脚本的行为将类似于C,并对逻辑运算符使用短路求值

if ((! -e $cache ) || ("`find $monitor -newer $cache`" != "")) then
...
endif
但是在if语句中,即使第一个条件为true,第二个条件也会被检查,并给出错误


我们是否有短路逻辑或C shell脚本?

通常,
&&
|
都是短路。考虑这样的事情:

$ false && echo foo
$ true || echo foo
在这两种情况下,foo都不会被淘汰


但是,您不能像这样使用这种字符串比较,即使是短路,csh仍然会对整个过程进行语法检查。

是的,
&&
|
在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命令的整个输出存储在一个变量中并不是真正必要的。相反,您可以调用find并使用其返回的状态来告诉您它是否找到了任何内容:

我刚试过这个:

if (! -e $cache || { find $monitor -newer $cache >& /dev/null } ) then
    echo ok
endif
它也起了作用——除了括号内的
&/dev/null
重定向似乎被忽略

相反,您可以单独执行“find”命令,然后检查结果$status。这意味着您将失去短路
| |
操作员的好处;您必须使用嵌套的
if
语句和/或临时变量

也许真正的教训是:我使用csh和tcsh的时间比我愿意承认的要长,而我能够弄明白很多这类东西的唯一方法就是反复试验。您可以使用tcsh或csh来实现这一点,但使用不同的脚本语言可能会更好。例如,在Bourne shell中,这相当简单:

if [ ! -e $cache ] || find $monitor -newer $cache >/dev/null 2>&1 ; then
    ...
fi