exec 命令内的管道将不起作用

exec 命令内的管道将不起作用

我在脚本中有命令:

exec su -s /bin/sh -c 'exec "$0" "$@"  | ts "[%Y-%m-%d %H:%M:%S]"' user -- test.python $FULLPATH   &> log & 

FULLPATH测试Python文件的路径在哪里。使用此命令,我希望将脚本的输出与命令的时间戳一起写入日志文件中ts

这实际上并没有发生,输出是在没有任何时间戳的情况下写入的,除此之外我也尝试这样做:

exec su -s /bin/sh -c 'exec "$0" "$@"' user -- test.python $FULLPATH  | ts "[%Y-%m-%d %H:%M:%S]" &> log & 

这也给出了与上一个命令相同的结果。

任何关于为什么会发生这种情况的想法以及可能的解决方案将不胜感激,谢谢。

答案1

使用execwith&没有什么意义(尽管这不会成为问题的根源),这不会节省任何额外的分叉。对于管道组件,我只能看到它用外壳保存了一个叉子zsh,但前提是应用于最后一个管道组件(cmd1 | exec cmd2,这意味着zsh不再等待其他管道组件)。

在这里,您没有将 python 脚本 stderr 重定向到ts,尽管您将其发送到文件log。您可能想要:

su -s /bin/sh -c '
  "$0" "$@" 2>&1 |
    ts "[%Y-%m-%d %H:%M:%S]"
  ' user -- test.python "$FULLPATH" > log 2>&1 & 

答案2

丢掉那些无意义的执行者,以及在 -- 之后传递一半命令的部分:

su -s /bin/sh -c "test.python $FULLPATH | ts '[%Y-%m-%d %H:%M:%S]'" &> log

相关内容