我需要用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
这不是我想要的。
我该怎么做呢?
基于手动执行的建议,我使用以下推理得出以下结果:
"$@"
语法意味着:将所有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
)