BASH在调试模式下引用

时间:2011-09-21 15:20:14

标签: 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

此脚本使用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调试模式中避免这种额外的引用?以这种方式记录命令是非常方便的,如果因为那些讨厌的引号我不能再这样做,那将是一种耻辱。

感谢您的帮助!

1 个答案:

答案 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[@]}"