bash 脚本 cd 命令影响 tee 命令

bash script cd command affecting tee command

我有一个脚本可以执行 git 操作。

仅当我删除 'cd' 命令时,打印到文件才有效。它可以很好地打印到标准输出上,但不能打印到文件上。 知道为什么 'cd' 会影响 'tee' 吗?

input.csv: 回购,分支 1,分支 2, git@github.com/myproject/test-1.git, feature1, feature2, git@github.com/myproject/test-2.git, feature1, feature2,

简化脚本:

#!/bin/bash

BASE_DIR=`pwd`
INPUT_FILE_CSV=input.csv
OUTFILE="output.txt"
[ -e $OUTFILE ] && rm -f $OUTFILE

while IFS="," read -r REPO SRC_BRANCH NEW_BRANCH
do
  echo "**********************Repo: ${REPO} **********************"
  REPO_NAME=`echo $REPO | rev |cut -d '/' -f1 |rev | sed 's|.git||g'`
  rm -rf $REPO_NAME
  ERR=$(git clone -q $REPO)
  if [ $? -eq 0 ]; then
    #Logic to check if the branch exists
#      cd $REPO_NAME
      # Run few other git commands
      echo "${REPO_NAME}; Success;" | tee -a $OUTFILE
    cd $BASE_DIR
    rm -rf $REPO_NAME
  else
    echo "${REPO_NAME}; Failure; ERR: ${ERR}" | tee -a $OUTFILE
  fi
done < <(cut -d "," -f1,2,3 $INPUT_FILE_CSV | tail -n +2)

预期输出:

test1;Success;
test2;Failure;Err: $ERR

当前输出:

test-1; Failure; ERR: 

注意:input.csv 中的 git URL 不是 real/valid。

tee -a $OUTFILE 扩展为 tee -a output.txt,它写入当前工作目录 中名为 output.txt 的文件。改变当前的工作目录,你就改变了文件的写入位置。在本例中,它在 $REPO_NAME 目录中创建了 output.txt 文件,该文件在几行之后被删除。

你可以通过使用 OUTFILE 的绝对路径来解决这个问题,但是如果你的 OS 支持 /dev/fd/ 条目来按数字访问文件描述符,我很想使用而是:

while IFS="," read -r REPO SRC_BRANCH NEW_BRANCH
    ...
    echo "${REPO_NAME}; Success;" | tee /dev/fd/3    # Copy to file descriptor #3
    ...
done < <(cut -d "," -f1,2,3 $INPUT_FILE_CSV | tail -n +2) 3> "$OUTPUT"
#                          this sends FD #3 to output.txt ^^^^^^^^^^^^

这样,输出文件在循环外打开,在任何目录更改发生之前(一旦打开,更改工作目录不会影响它)。

顺便说一句,你应该 运行 你的脚本通过 shellcheck.net; it'll have a number of good recommendations for improving your script. Checking for errors on cd commands is particularly important, since if cd fails it'll run the following commands in the wrong place, which can have very bad consequences

此外,我建议切换到小写或混合大小写的变量名,因为有许多全大写的名称带有特殊 meaning/function,不小心将其中一个用于其他名称可能会导致问题.