我尝试构建一个Git prepare-commit-msg钩子,它为git bash(mingw32)提供以下输出:
<file1>:
-
<file2>:
-
...
和
#!/bin/bash
git diff --cached --name-status | while read line; do echo $OUTPUT$line$':\n - \n'; done
效果很好
git diff --cached --name-status
为已更改的索引中的每个文件打印<mode>\t<filePath>
。
但是当我做的时候
#!/bin/bash
git diff --cached --name-status | while read line; do OUTPUT=$OUTPUT$line$':\n - \n'; done
echo $OUTPUT
或
#!/bin/bash
git diff --cached --name-status | while read line; do OUTPUT+=$line$':\n - \n'; done
echo $OUTPUT
$OUTPUT
为空
这也可以正常使用
COUNTER=0
while [ $COUNTER -lt 10 ]; do
TEST+=$COUNTER$':\n'
let COUNTER=COUNTER+1
done
echo $TEST
我做错了什么?
解决
#!/bin/bash
git diff --cached --name-status | {
while read line; do
output=$output$var$':\n - \n'
done
echo "$output" > $1
}
答案 0 :(得分:2)
因为您正在使用管道,Private Sub Worksheet_Activate()
If Left(ActiveSheet.Name, 3) = "SOD" then
Call Module1.Macro1
Call Module2.Macro2
End If
End Sub
循环在子shell中运行,所以当子shell退出时,其变量随之消失。您离开父 shell中的while
变量,该变量为空。
您必须确保在父shell中构建OUTPUT:
$OUTPUT
或使用&#34; lastpipe&#34;设置为在当前shell中运行管道的最后一个命令(作业控制需要关闭)
while read line; do
OUTPUT+=$line$':\n - \n'
done < <(git diff --name-status)
echo "$OUTPUT"
或者,在子shell中输出变量
set +m; shopt -s lastpipe
git diff --name-status | while read line; do OUTPUT+=$line$':\n - \n'; done
echo "$OUTPUT"
其他说明:
git diff --name-status | {
while read line; do OUTPUT+="$line"$':\n - \n'; done
echo "$OUTPUT"
}
。答案 1 :(得分:1)
您根本不需要构建变量OUTPUT
。只需在读取输入时写入输出。 (使用printf
比使用echo
更清晰,更标准。)
git diff --cached --name-status | while read line; do
printf '%s:\n - \n' "$line"
done