BASH цитаты в режиме отладки - PullRequest
       20

BASH цитаты в режиме отладки

2 голосов
/ 21 сентября 2011

Я использую режим отладки в скрипте 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

Этот скрипт генерирует отправки в очереди заданий lsf с помощью команды bsub, но это не должно иметь значения. На 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 Ответ

5 голосов
/ 21 сентября 2011

Вы не можете сделать это с простыми переменными, оболочка будет анализировать ее для разделения аргументов. Вы можете сделать 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[@]}"
...