我需要使用bash将用户提供的命令写入文件。
测试用例为script.sh -- echo "Hello \$USER"
,我想要一个包含echo "Hello $USER"
(或echo Hello\ $USER
)的文件,该文件可以执行
我正在使用Heredoc写入文件,所以类似
cat > "${FILE}" <<EOF
Your command is:
${CMD}
"$@"
EOF
我尝试使用printf -v CMD '%q ' "$@"
,但是导致echo Hello\ \$USER
,这不是我想要的。
我该怎么做?
答案 0 :(得分:1)
根据建议手动执行此操作,我使用以下推理提出了以下建议:
"$@"
的语法含义:将所有args扩展到"$1" "$2" ...
CMD=()
for var in "$@"; do
CMD+=( '"'"${var}"'"' )
done
cat > ${FILE} <<EOF
Your command is:
${CMD[@]}
所以基本上:创建一个带引号的字符串数组。然后打印此。这适用于测试用例。
但是:它因其他许多原因而失败。例如:myScript.sh -- echo "Hello \"\$USER\""
使引号不转义。
所以我得出结论,这项任务是不可能的,或者至少是不可行的,因此建议使用基于printf
的解决方案,这似乎也是其他命令如何处理它的示例(例如:SLURM上的srun/sbatch
)