gpt4 book ai didi

arrays - 在 heredoc 中使用存储为 Bash 数组的命令

转载 作者:行者123 更新时间:2023-11-29 09:29:16 25 4
gpt4 key购买 nike

背景:我正在编写一个包装器脚本,用于处理将我们研究人员的工作发送到我们的计算集群(其中一个使用 SLURM,另一个使用 Torque/PBS)。它还必须作为一些分析软件(例如 FSL)中包含的包装器脚本的直接替代品,以便它们可以直接与集群交互。

在用户端,脚本会这样调用:

submit_job [arguments] <command to run>

对调度程序的调用被组装并且 <command to run>应该以提交给调度程序的小脚本结束。目前,这是这样实现的:

# In case of SLURM
sbatch <sbatch arguments> <<EOF
#!/usr/bin/env bash
srun "${@}"
EOF

但是,如果我只使用 ${@} , 引号不被保留。该命令可以包含引号(例如带空格的路径),并且可以有多个命令以分号分隔(然后整个内容将被引号括起来)。我无法真正控制将使用它的人和软件组合在一起的内容。

那么,我怎样才能从 A(脚本参数)到 B(变量)再到 C(heredoc)而不弄乱提高报价?

我按照经常引用的 FAQ entry 中的建议,使用 Bash 数组组装调度程序命令。 ,它工作正常。然而,虽然我可以这样做:

#/usr/bin/env bash
run=( mkdir "foo bar" )
set -x
"${run[@]}"
set +x

和目录foo bar已创建,我不能这样做:

#/usr/bin/env bash
run=( mkdir "foo bar" )
/usr/bin/env bash <<EOF
set -x
$run[@]
"${run[@]}"
set +x
EOF

第一个创建目录foobar ,因为发生扩展,第二个尝试运行 mkdir foo bar,但失败了.

那么,我还剩下什么?

提前致谢

最佳答案

使用 printf "%q" 转义您的参数。这是传递参数的好方法。

#/usr/bin/env bash
run=(mkdir "foo bar")
/usr/bin/env bash <<EOF
set -x
${run[@]} # this expands into `mkdir foo bar`
$(printf "%q " "${run[@]}") # this expands into `mkdir foo\ bar`
set +x
EOF

关于arrays - 在 heredoc 中使用存储为 Bash 数组的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com