2015-05-29 29 views
2

我正在编写一个bash脚本以从origin.Git中抽取master分支,并在每个应用程序模块中进行初始化。在bash中的命令之间使用&号(&)时重定向stdout和stderr

我的目录结构:

.-----bash_script 
|----app1(git init) 
        |...various modules 
        |...error.txt 
        |...output.txt 
|----app2(git init) 
        |...various modules 
        |...error.txt 
        |...output.txt 

在bash_script:$目录包含(APP1或APP2 ...它在一个循环中被调用)

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

以上两行被称为为每应用程序。 这是我迄今所做

问题:

  1. 我只得到stdout/stderr只为我的最后一个命令即从原产和结账不拉。是否可以在每个&&之前得到整个命令的输出而无需写入文件名?那么如何在应用程序目录内部生成error.txt/output.txt文件

  2. 。我怎样才能在bash_script目录中生成它们,即上一层。

  3. 当执行GIT中拉原点主

    From http://gitProjectUrl branch master -> FETCH_HEAD

    上述线在error.txt重定向。

    Already up-to-date.

    而此行是在output.txt的重定向

    为什么两条线不是output.txt的

回答

1

只是它们组合在一起使用{...}

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

我想这是更好地去'{}'过'()'当可能的,但子shell的一个很好的副作用是,有没有必要之后改变目录。 –

+0

是的,但通常'cd -'会照顾它并且分壳子有比这更多的副作用。 – anubhava

2

使用子Shell (...)收集所有输出在一个单一的数据流:

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

这解决了这两个问题,因为流在​​cd命令之前制备。

相关问题