bash 脚本 cd 命令影响 tee 命令
bash script cd command affecting tee command
我有一个脚本可以执行 git 操作。
- 为 repo、源代码和新分支解析文件
- 克隆存储库
- 检查新分支是否已经存在。如果有,请跳过此 repo
- 创建新分支:
- cd 进入文件夹
- git分支new_branch
- git结帐new_branchorigin/source_branch
- git 推送原点 new_branch
- 使用 tee 打印状态管道(标准输出和文件)
- reset: cd 退出文件夹并删除文件夹。
- 下一个条目
仅当我删除 '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,不小心将其中一个用于其他名称可能会导致问题.
我有一个脚本可以执行 git 操作。
- 为 repo、源代码和新分支解析文件
- 克隆存储库
- 检查新分支是否已经存在。如果有,请跳过此 repo
- 创建新分支:
- cd 进入文件夹
- git分支new_branch
- git结帐new_branchorigin/source_branch
- git 推送原点 new_branch
- 使用 tee 打印状态管道(标准输出和文件)
- reset: cd 退出文件夹并删除文件夹。
- 下一个条目
仅当我删除 '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,不小心将其中一个用于其他名称可能会导致问题.