我在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
此脚本使用bsub命令生成对lsf作业队列的提交,但这无关紧要。 在STDERR上,我看到了这个痕迹:
+ bsub -q long -M5000000 '-R"select[mem>5000]' 'rusage[mem=5000]"'
Job submission rejected.
bsub命令应该是这样的:
+ bsub -q long -M5000000 -R"select[mem>5000]' 'rusage[mem=5000]"
所以我的bsub命令失败了,我也可以看到这是因为它没有看到-R开关,大概是因为整个开关周围有额外的单引号。
据我所知,BASH在调试模式下将单引号放在引用的字符串周围,但我没想到这会影响正在发出的实际命令,这似乎已经发生了。
我在这里做错了什么,或者有没有办法在BASH调试模式中避免这种额外的引用?以这种方式记录命令是非常方便的,如果因为那些讨厌的引号我不能再这样做,那将是一种耻辱。
感谢您的帮助!
答案 0 :(得分:5)
你不能用普通变量做到这一点,shell会将它解析为单独的参数。你可以做eval,但我不推荐它:
eval bsub $job_opts
您可以使用数组执行此操作:http://mywiki.wooledge.org/BashFAQ/050
job_opts=("-q" "long" "-M5000000" '-R"select[mem>5000] rusage[mem=5000]"')
bsub "${job_opts[@]}"