我在我的机器上运行tcsh / csh shell。最近我意识到我的stderr文件重定向无法正常工作。
请查看以下终端日志:
>echo b c >>& log
>cat log
b c
>echo $a b c >>& log
a: Undefined variable.
>cat log
b c
我从未遇到过这样的问题,因此不确定如何调试或排除故障。 请指教!
重定向的改变方法是使用tee。 虽然我使用>&或>>& ,我完全阻止任何输出显示在终端上。 有没有办法可以做到这两点,那就是:对于每个陈述
a)将stdout + stderr直接发送到文件。
b)在终端上显示stdout + stderr
我需要确认我是否可以使用这样的(下面)来满足我的要求
>csh ./script_name | tee -a log
在我的情况下,它只将stdout指向日志文件并阻止stderr。
答案 0 :(得分:1)
我非常肯定$a
的评估是由当前的shell 在为<{1}}子shell设置重定向之前完成的?
echo
实际上并没有写入文件 这一事实似乎支持了这一点,如果您删除echo
文件,则可以看到在第二次尝试之前:
log
而且,如果你在明确的子shell中运行[pax ~]$ echo b c >>& log
[pax ~]$ cat log
b c
[pax ~]$ rm log
[pax ~]$ echo $a b c >> & log
a: Undefined variable.
[pax ~]$ cat log
cat: log: No such file or directory
并为子shell而不是echo
完成重定向,那么你得到了你想要的结果:
echo
事实上,即使使用有效的命令,您也可以看到这一点:
[pax ~]$ ( echo $a b c ) >> & log
[pax ~]$ cat log
b c
a: Undefined variable.
原因是当前的shell抱怨试图评估[pax ~]$ rm log
[pax ~]$ $xyzzy
xyzzy: Undefined variable.
[pax ~]$ $xyzzy >>&log
xyzzy: Undefined variable.
[pax ~]$ cat log
cat: log: No such file or directory
。这是有道理的。使用命令:
$xyzzy
someCmd $HOME
可执行文件将从不查看文字someCmd
,它实际上已替换为该值。并且在$HOME
被设置之前由shell完成替换(包括修改其标准输入或输出流)。
答案 1 :(得分:0)
您无法执行文件描述符操作以及过去20年来Csh Programming is considered harmful已经回应的口头禅。
有许多替代shell可用,甚至/ bin / sh是编程脚本比tcsh / csh更好的选择。我希望在这段时间之后没有人强迫你使用csh。