2010-06-14 70 views
4

我有一个tcsh shell脚本,我想在大多数时间停止非零状态的错误,但在某些情况下,我想忽略它。例如:如何运行tcsh shell命令并选择性地忽略状态?

#!/bin/tcsh -vxef 

cp file/that/might/not/exist . #Want to ignore this status 
cp file/that/might/not/exist . ; echo "this doesn't work" 
cp file/that/must/exist . #Want to stop if this status is nonzero 
+1

csh编程被认为是有害的。认真。 http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ – msw 2010-06-15 15:14:06

+0

我正在寻找类似的问题。看起来tcsh处理内置命令(如cd和limit)与外部命令(如false)不同。无论-e如何,内置命令都会导致脚本终止。另外,“|| echo last command failed”不能按预期工作。用-e表示||之后的部分永远不会被调用。没有-e之后的部分按预期调用,但对于内置命令,您将在此之后立即退出脚本。呸! – 2017-09-27 18:06:38

回答

3

在这里,我们去:生成一个新的外壳,使用“;”忽略第一个状态,并返回全部清除。

$SHELL -c 'cp file/that/might/not/exist . ; echo "good"' 
+0

考虑用“:”替换“echo good”以防止回显任何内容。 – macetw 2017-05-04 18:46:57

+0

该解决方案甚至适用于bash。 – macetw 2017-05-04 18:49:25

3

我不知道tcsh的,但在bash,你可以使用set -e做到这一点。当设置-e标志时,如果任何子命令失败,bash将立即退出(请参阅手册了解技术细节)。未设置时,将继续执行。所以,你可以做这样的事情:

set +e 
cp file/that/might/not/exist . # Script will keep going, despite error 
set -e 
cp file/that/might/not/exist . # Script will exit here 
echo "This line is not reached" 
2
mustsucceed || exit 1 
mustbeignored || : 
+0

这对我不起作用。脚本仍然停止。 – 2010-06-15 17:01:04

+1

@Walter,那么当你调用shell时你不能使用'-e'。 – 2010-06-15 18:33:31

+0

@glennjackman,正如他在问题的顶部所说的那样,他“大多数时候想停止在非零状态下出现错误。”这就是为什么我们要用'-e'来实现这一点。 – macetw 2017-05-04 18:53:50

1

如果你如果失败的话不小心,从你的家当删除-e。如果你看过tcsh documentation,亚当的回答应该给你一个提示。

此外,你可以扔掉的错误消息:

cp dont_care  . >& /dev/null 
cp still_dont_care . >& /dev/null || echo "not there" 
cp must_be_there . >& /dev/null || exit 1 # oh noes! 
+0

大部分时间我都在乎,如果失败了。对于一些特殊情况,我不在乎。 – 2010-06-15 18:29:16

+1

只要'#!/ bin/tcsh -vxef'中有'e',它就会一直出错;这就是'e'所做的。你必须删除'e'来获得其他行为。 '' – frayser 2010-09-30 05:00:17