在tcsh中隐藏stderr和pipe stdout

时间:2016-07-06 08:00:21

标签: linux bash shell csh tcsh

如何隐藏stderr但在csh脚本中使用stdout?

我试图在某个文件中找到可能存在或不存在的事件,并根据结果采取行动:

if (`grep phrase file | wc -l` > 0) then
    echo 'Match!'
endif

问题是如果文件不存在,控制台上会显示错误。

我找到了如何删除stderr并将stdout重定向到控制台(根据https://unix.stackexchange.com/questions/35715/stderr-redirection-not-working-in-csh):

`(grep phrase file | wc -l > /dev/tty) >& /dev/null

但它在我的情况下不起作用,因为我想在脚本中使用结果。

我考虑过替换临时文件中的/dev/tty并使用其内容,但我想知道是否存在没有临时文件的解决方案。

另一种方法是使用我的csh脚本中的bash:

if (`echo 'grep phrase file 2> /dev/null' | sh | wc -l`) then
    echo 'Match!'
endif

但是如果grep命令更复杂,这可能会使脚本复杂化,例如当使用变量时,下面的命令不会按原样运行:

if (`echo 'grep $phrase file 2> /dev/null' | sh | wc -l`) then
    echo 'Match!'
endif

因此我更喜欢csh pure solution。

我怎样才能在纯csh中做到这一点?

1 个答案:

答案 0 :(得分:1)

您只需将 2>& - 添加到命令后即可关闭标准错误。

如果C shell(特别是)抱怨这种语法(我不记得,我不会在令人惊讶的不完整的#34;参考手册"中看到它),那么它采用旧的瑞士军刀技术,即 2> / dev / null 。这就是/ dev / null的用途:它是内存设备驱动程序的一个入口点,只是丢弃写入它的数据。