2

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デバッグモードでこの余分な引用を回避する方法はありますか?この方法でコマンドをログに記録するのは非常に便利なので、これらの厄介な引用のためにそれを実行できなくなった場合は残念です。

ご協力いただきありがとうございます!

4

1 に答える 1

5

プレーン変数ではそれを行うことはできません。シェルはそれを解析して引数を分離します。あなたは評価を行うことができますが、私はそれをお勧めしません:

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[@]}"
于 2011-09-21T15:28:24.983 に答える