0

Cygwin64 経由でシェル スクリプトを実行すると、エラーが発生します (以下の出力)。スクリプトの関連部分は次のとおりです。興味深いのは、エコーされたコマンドをコピーして貼り付けると、問題なく実行されることです。それで、私が正しくできていないのは何ですか?

[worldwidewilly@SAL9000 resources]$ makebook MyBook
Generating dblatex PDF output via a2x
a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book' --dblatex-opts='-V -T db2latex' MyBook.asciidoc
Usage: a2x [OPTIONS] SOURCE_FILE

a2x: error: option -d: invalid choice: "book'" (choose from 'article', 'manpage',   'book')
done.

スクリプト ロジックは次のとおりです。

ASCIIDOC_OPTS="--asciidoc-opts='-a lang=en -v -b docbook -d book'"
DBLATEX_OPTS="--dblatex-opts='-V -T db2latex'"
echo "Generating dblatex PDF output via a2x"
cmd="a2x -v -f pdf -L ${ASCIIDOC_OPTS} ${DBLATEX_OPTS} $1.asciidoc"
echo $cmd
$cmd
echo "done."

スクリプトは、*nix ファイル末尾の UTF-8 として保存されています。これは、Windows 7 で実行される Cygwin64 の新規インストールです。

FWIW - 回避策があります。book という単語の後、単一のアポストロフィの前にスペースを追加すると、上記のエラーが発生します。ただし、DBLATEX_OPTS の -T はエラーとしてフラグが立てられます。

[worldwidewilly@SAL9000 resources]$ makebook MyBook
Generating dblatex PDF output via a2x
a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book ' --dblatex-opts='-V -T db2latex' MyBook.asciidoc
Usage: a2x [OPTIONS] SOURCE_FILE
a2x: error: no such option: -T
done.

また、エコーされたコマンドをコピーしてコマンド ラインから実行すると、機能します。これはすべて非常に紛らわしいです。

4

1 に答える 1

3

変数にはデータが含まれているはずであり、bash はそれらをデータとして扱います。これは、引用符のようなシェルのメタ文字もデータとして扱われることを意味します。

このトピックに関する完全な議論については、この記事を参照してください。

簡単な答えは、代わりに配列を使用することです。

ASCIIDOC_OPTS=( --asciidoc-opts='-a lang=en -v -b docbook -d book' )
DBLATEX_OPTS=( --dblatex-opts='-V -T db2latex' )
cmd=(a2x -v -f pdf -L "${ASCIIDOC_OPTS[@]}" "${DBLATEX_OPTS[@]}" "$1".asciidoc)
# Print command in pastable format:
printf '%q ' "${cmd[@]}"
printf '\n'
# Execute it
"${cmd[@]}"

使用しないでくださいeval:

eval "$cmd" #noooo

これは、投稿したコードで機能するように見えますが、警告とセキュリティの問題があります。

于 2013-08-20T00:24:53.333 に答える