将用户提供的命令写入文件

时间:2019-04-16 15:36:35

标签: bash heredoc variable-expansion

我需要使用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,这不是我想要的。

我该怎么做?

1 个答案:

答案 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