2016-07-06 56 views
1

如何隐藏标准错误,但在csh脚本使用标准输出?隐藏stderr和标准输出管道tcsh中

我试图找到出现在一些文件,它可以根据结果存在与否,并采取行动:

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并使用其内容,但我不知道是否有没有临时文件的解决方案。

另一种方法是使用bash从我的CSH脚本:

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纯粹的解决方案。

我该怎么办,在纯CSH?

+0

我不认为你能做到这一点在csh壳,并与管道命令SH您的解决方案是** **究竟发生了什么给我。你可以得到的变量,如果你周围使用grep的双guotes(“),而不是单引号(')来代替。 – MAP

+0

是否使用双引号修复与未扩大变量的问题? – 123

+0

我没有检查它,其实我情况比简单的变量问题,我这里显示要复杂得多。恐怕在这里发布,全案将使得问题和答案太复杂,无法使用。我只是想展现的,为什么我更喜欢使用csh而不是重定向的原则打击。 – MaMazav

回答

1

您可以通过只加后缀2> & -来关闭标准错误。

如果C shell(特别是)抱怨这种语法(我不诚实地回想起来,而且我没有在令人惊讶的不完整的“参考手册”中看到它),那么用旧的瑞士军刀技术,即2>/dev/null。这就是/ dev/null的作用:它是内存设备驱动程序的入口点,仅仅丢弃写入它的数据。

相关问题