tos*_*spo 2 debugging bash quoting
我在BASH脚本中使用调试模式来跟踪脚本执行的命令.到目前为止,这一切都运行良好,但现在我需要运行一个命令,其中包含一些字符串中的选项,该字符串包含引号,这些引号似乎在调试模式下导致问题.
这是一个简短的例子
#!/bin/bash
job_opts='-q long -M5000000 -R"select[mem>5000] rusage[mem=5000]"'
set -x
bsub $job_opts # .... more options for job here
set +x
Run Code Online (Sandbox Code Playgroud)
此脚本使用bsub命令生成对lsf作业队列的提交,但这无关紧要.在STDERR上,我看到了这个痕迹:
+ bsub -q long -M5000000 '-R"select[mem>5000]' 'rusage[mem=5000]"'
Job submission rejected.
Run Code Online (Sandbox Code Playgroud)
bsub命令应该是这样的:
+ bsub -q long -M5000000 -R"select[mem>5000]' 'rusage[mem=5000]"
Run Code Online (Sandbox Code Playgroud)
所以我的bsub命令失败了,我也可以看到这是因为它没有看到-R开关,大概是因为整个开关周围有额外的单引号.
我知道BASH在调试模式下在引用的字符串周围放置单引号,但我没想到这会影响正在发出的实际命令,这似乎已经发生了.
我在这里做错了什么,或者有没有办法在BASH调试模式中避免这种额外的引用?以这种方式记录命令是非常方便的,如果因为那些讨厌的引用我不能再这样做,那将是一种耻辱.
谢谢你的帮助!
你不能用普通变量做到这一点,shell会将它解析为单独的参数.你可以做eval,但我不推荐它:
eval bsub $job_opts
Run Code Online (Sandbox Code Playgroud)
您可以使用数组来完成:http://mywiki.wooledge.org/BashFAQ/050
job_opts=("-q" "long" "-M5000000" '-R"select[mem>5000] rusage[mem=5000]"')
bsub "${job_opts[@]}"
Run Code Online (Sandbox Code Playgroud)