Linux 在bash中的命令之间使用符号(&;)时重定向stdout和stderr

Linux 在bash中的命令之间使用符号(&;)时重定向stdout和stderr,linux,git,bash,Linux,Git,Bash,我正在编写一个bash脚本来从源代码中提取主分支。Git在每个应用程序模块中都被初始化 我的目录结构: .-----bash_script |----app1(git init) |...various modules |...error.txt |...output.txt |----app2(git init) |...various modules

我正在编写一个bash脚本来从源代码中提取主分支。Git在每个应用程序模块中都被初始化

我的目录结构:

.-----bash_script
|----app1(git init)
                  |...various modules
                  |...error.txt
                  |...output.txt
|----app2(git init)
                  |...various modules
                  |...error.txt
                  |...output.txt
在bash_脚本中:$目录包含(app1或app2…在循环中调用)

以上两行是为每个应用程序调用的。 这就是我到目前为止所做的

问题:

  • 我只为我的最后一个命令获取
    stdout/stderr
    ,即从原点拉入不从签出。是否可以在不在每个
    &&
    之前写入文件名的情况下获得整个命令的输出??那怎么办

  • error.txt/output.txt文件在应用程序目录中生成。如何在bash_脚本目录中生成它们,即一级以上

  • 当执行git pull origin master时

    来自http://gitProjectUrl
    分支主控->取头

    上述行在error.txt中重定向

    已经是最新的。

    这一行在output.txt中被重定向

    为什么两行都不在output.txt中

  • 使用子shell
    (…)
    收集单个流中的所有输出:

    ( cd ... && ... && git pull origin master ) >> output.txt 2>>error.txt
    

    这解决了这两个问题,因为流是在
    cd
    命令之前准备好的。

    只需使用
    {…}
    将它们组合在一起:

    { cd "${directory}" && git checkout master && git pull origin master; } >>output.txt 2>>error.txt
    cd ..
    

    我想在可能的情况下,最好使用
    {}
    而不是
    ()
    ,但是子shell的一个很好的副作用是以后不需要更改目录。是的,但通常
    cd-
    会处理它,而派生子shell的副作用比这多得多。
    { cd "${directory}" && git checkout master && git pull origin master; } >>output.txt 2>>error.txt
    cd ..