如何重定向子进程的输出?

the_velour_fog

我正在运行以下git clone命令sudobash并且想将STDOUT重定向到日志文件:

% sudo -u test_user bash -c "git clone https://github.com/scrooloose/nerdtree.git
/home/test_user/.vim/bundle/nerdtree >> /var/log/build_scripts.log"

发生了什么事,STDOUT正在继续发送到终端。IE

Cloning into 'nerdtree'...
remote: Counting objects: 3689, done.
[...]
Checking connectivity... done.

我猜这个问题与以下事实有关sudo:先创建一个新进程,然后再bash创建另一个进程,如下所示:

% sudo -u test_user bash -c "{ git clone https://github.com/scrooloose/nerdtree.git
/home/test_user/.vim/bundle/nerdtree >> /var/log/build_scripts.log; ps f -g$$; }"  

  PID TTY      STAT   TIME COMMAND
 6556 pts/25   Ss     0:02 /usr/bin/zsh
 3005 pts/25   S+     0:00  \_ sudo -u test_user bash -c { git clone https://github.com/scrooloo
 3006 pts/25   S+     0:00      \_ bash -c { git clone https://github.com/scrooloose/nerdtree.
 3009 pts/25   R+     0:00          \_ ps f -g6556

我试过了

  • 在脚本中运行此exec >> /var/log/build_script.log命令在命令之前使用
  • 将命令包装在函数中,然后调用并重定向函数输出

但是我认为这些重定向仅适用于父级,子进程默认将STDOUT发送到其父级的进程,/dev/tty/25从而导致输出继续发送到终端。
如何重定向此命令的STDOUT?

芒登

您提到的消息不会打印到标准输出,而是打印到标准错误。因此,要捕获它们,您需要重定向标准错误而不是标准输出:

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo 2>> log"

或STDERR和STDOUT:

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo >> log 2>&1"

使用bash,您还可以使用&>>

sudo -u user bash -c "git clone https://github.com/foo.git ~/foo &>> log"

cshtcshzsh相当于存在>>&(t)csh不支持2>&1所以它的唯一办法):

sudo -u user csh -c "git clone https://github.com/foo.git ~/foo >>& log"

fish

sudo -u user fish -c "git clone https://github.com/foo.git ~/foo >> log ^&1"

有关各种不同类型的重定向运算符的更多信息,请参见Shell的控制和重定向运算符是什么?

现在,在的特定情况下git,还有另一个问题。像其他一些程序一样,git可以检测到其输出正在重定向,并且可以停止打印进度报告。这可能是因为报告旨在实时显示并包含\r在保存在文件中时可能出现的问题。要解决此问题,请使用:

       --progress
       Progress status is reported on the standard error stream by default
       when it is attached to a terminal, unless -q is specified. This
       flag forces progress status even if the standard error stream is
       not directed to a terminal.

和:

sudo -u user bash -c "git clone --progress https://github.com/foo.git ~/foo >> log 2>&1"

如果您想同时看到输出保存到文件,请使用tee

sudo -u user bash -c "git clone --progress https://github.com/foo.git ~/foo 2>&1 | 
    tee -a log

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在子进程中重定向标准输出是否也会对父进程进行重定向?

来自分类Dev

如何更改正在运行的进程的输出重定向?

来自分类Dev

如何重定向或检索 Powershell 脚本运行的 telnet 进程的输出?

来自分类Dev

将输入\输出管道从父进程重定向到cmd子进程C / C ++ WinApi

来自分类Dev

如何将子流程的输出重定向到文件

来自分类Dev

查看进程的输出被重定向的内容

来自分类Dev

重定向标准输出时在python上调用子进程时出错

来自分类Dev

让子进程将printf正确地重定向到标准输出

来自分类Dev

重定向标准输出时在python上调用子进程时出错

来自分类Dev

C-重定向子进程的IO

来自分类Dev

重定向子进程的文件流

来自分类Dev

如何更改重定向输出?

来自分类Dev

如何重定向LLI输出?

来自分类Dev

子Shell进程双向重定向到父进程

来自分类Dev

如何在Linux Shell中将正在运行的进程的输出重定向到文件

来自分类Dev

Unix:如何修改和重定向所有正在运行的进程的标准输出

来自分类Dev

如何重定向后台进程的STDIN?

来自分类Dev

如何重定向到进程去?

来自分类Dev

使用输入/输出重定向在后台运行进程

来自分类Dev

更改正在运行的进程的输出重定向

来自分类Dev

subprocess.Popen不会重定向生成的进程的输出

来自分类Dev

Unix别名重定向后台进程输出

来自分类Dev

在任务假脱机程序中重定向进程输出

来自分类Dev

获取正在运行的进程的输出重定向部分

来自分类Dev

使用重定向的stdin在子进程中提高SystemExit

来自分类Dev

将子进程的stdout / stderr重定向到文件

来自分类Dev

将Powershell脚本的stdin重定向到子进程

来自分类Dev

在Python的子进程/ Popen中将stdout重定向到stderr

来自分类Dev

在Python的子进程/ Popen中将stdout重定向到stderr

Related 相关文章

  1. 1

    在子进程中重定向标准输出是否也会对父进程进行重定向?

  2. 2

    如何更改正在运行的进程的输出重定向?

  3. 3

    如何重定向或检索 Powershell 脚本运行的 telnet 进程的输出?

  4. 4

    将输入\输出管道从父进程重定向到cmd子进程C / C ++ WinApi

  5. 5

    如何将子流程的输出重定向到文件

  6. 6

    查看进程的输出被重定向的内容

  7. 7

    重定向标准输出时在python上调用子进程时出错

  8. 8

    让子进程将printf正确地重定向到标准输出

  9. 9

    重定向标准输出时在python上调用子进程时出错

  10. 10

    C-重定向子进程的IO

  11. 11

    重定向子进程的文件流

  12. 12

    如何更改重定向输出?

  13. 13

    如何重定向LLI输出?

  14. 14

    子Shell进程双向重定向到父进程

  15. 15

    如何在Linux Shell中将正在运行的进程的输出重定向到文件

  16. 16

    Unix:如何修改和重定向所有正在运行的进程的标准输出

  17. 17

    如何重定向后台进程的STDIN?

  18. 18

    如何重定向到进程去?

  19. 19

    使用输入/输出重定向在后台运行进程

  20. 20

    更改正在运行的进程的输出重定向

  21. 21

    subprocess.Popen不会重定向生成的进程的输出

  22. 22

    Unix别名重定向后台进程输出

  23. 23

    在任务假脱机程序中重定向进程输出

  24. 24

    获取正在运行的进程的输出重定向部分

  25. 25

    使用重定向的stdin在子进程中提高SystemExit

  26. 26

    将子进程的stdout / stderr重定向到文件

  27. 27

    将Powershell脚本的stdin重定向到子进程

  28. 28

    在Python的子进程/ Popen中将stdout重定向到stderr

  29. 29

    在Python的子进程/ Popen中将stdout重定向到stderr

热门标签

归档