我需要在while循环结束后保留TEMP_FLAG
的值。
#!/bin/bash
TEMP_FLAG=false
# loop over git log and set variable
git log --pretty="%H|%s" --skip=1 |
while read commit; do
# do stuff like parsing the commit...
# set variable
TEMP_FLAG=true
done
echo "$TEMP_FLAG" # <--- evaluates to false :(
我知道我的问题是由git log
引导到while循环引起的,这会产生一个子shell,它不会返回我更新的变量。
但是,有没有办法在不改变管道的情况下实现我的预期行为?
答案 0 :(得分:1)
当您使用管道时,您将自动创建子壳,以便shell可以连接输入和输出。这意味着您无法修改父环境,因为您现在处于子进程中。
正如anubhava所说,你可以通过使用过程替换来重新构造循环以避免管道:
while read commit; do
TEMP_FLAG=true
done < <( git log --pretty="%H|%s" --skip=1 )
printf "%s\n" "$TEMP_FLAG"