从 shell 脚本将命令写入文件

从 shell 脚本将命令写入文件

我想将几行命令写入文件,但一些写入的命令正在$(...)被评估。我希望$(...)保留这些命令。

我已尝试以下操作:

cat > .git/hooks/pre-commit << EOM
#Colors
RED='\033[0;31m'
NC='\033[0m' # No Color

# Javascript unit tests 
res=$(script -q /dev/null ./tests/hooks/non-ui-test-hook )
RESULT=$?
[ $RESULT -ne 0 ] && echo -e "$res" && exit 1
echo -e "All test cases passed.\n"
exit 0
EOM

它在文件中写入以下内容:

#Colors
RED='\033[0;31m'
NC='\033[0m' # No Color

# Javascript unit tests
res=Warning: Could not find any test files matching pattern: test
No test files found
RESULT=1
[  -ne 0 ] && echo -e "" && exit 1
echo -e "All test cases passed.\n"
exit 0

我怎样才能保存$(...)在输出文件中?

答案1

您也可以选择退出$

\$(...)
\$

在您的代码中:

cat > .git/hooks/pre-commit << EOM
#Colors
RED='\033[0;31m'
NC='\033[0m' # No Color

# Javascript unit tests 
res=\$(script -q /dev/null ./tests/hooks/non-ui-test-hook )
RESULT=\$?
[ $RESULT -ne 0 ] && echo -e "$res" && exit 1
echo -e "All test cases passed.\n"
exit 0
EOM

答案2

EOM在您的例子中,引用此处文档的结束指示符:

cat > .git/hooks/pre-commit << 'EOM'
...
...
EOM

使用双引号或反斜杠转义也可以:

cat > .git/hooks/pre-commit << "EOM"
...
...
EOM

或者

cat > .git/hooks/pre-commit << \EOM
...
...
EOM

您可能没有注意到,但RESULT=$?也得到了扩展,即命令替换内部RESULT=1的退出状态。script...

仅出于完整性考虑,如果您希望进行某些扩展而不进行其他扩展,则需要遵循当前所拥有的,并使用典型的转义方法来转义您想要保留的扩展。

相关内容