在 Linux 上,以下 cd 可以正常工作,因此 cd 到 tmp:
/ # cd /tmp
tmp #
但这不起作用(保留在根目录,/var/log/messages 中什么也没有出现)。为什么不?
/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #
我尝试剥离此 stderr 重定向,但这也不起作用。
我的目标是将脚本的所有输出重定向到系统日志,如果我尝试将 CD 放入不存在/权限被拒绝/等的目录中,也是如此。为什么它不起作用以及如何让它起作用?
正常的回显确实会打印到系统日志,因此确实有效:
echo Test | /usr/bin/logger -t Test
答案1
管道并行执行生产者(左侧)进程和消费者(右侧)进程。由于有两个并行进程,因此至少其中一个需要是主 shell 进程的子进程,也可能两者都是。
大多数 shell 在子进程中执行管道的两侧。 ATT ksh 和 zsh 执行原始进程中的右侧。
这cd
命令更改了当前 shell 进程的当前目录,因此需要是内置的。由于管道的左侧是在子 shell 中执行的(子进程是分叉的从执行脚本的 shell 进程开始),该cd
命令仅在子 shell 中生效。它可以工作,但是由于子 shell 之后立即退出,所以它没有做任何有用的事情。你可以观察它
{ cd /tmp; echo -n "left-hand side: "; pwd; } |
{ cd /usr; echo -n "right-hand side: "; pwd; }
echo -n "parent: "; pwd
要记录脚本的输出,请创建一个适用于整个脚本的管道。
main () {
… # whole script goes here
}
main | logger