1

私はシェルスクリプトにあまり詳しくありません。スクリプトを変更したいのですが、変更後に「そのようなファイルまたはディレクトリはありません」というエラーが表示されます。

ただし、そのコマンドはコマンド プロンプトで機能します。

これが問題を引き起こす行です。(以下のコマンドがどのようにプロセスを生成するかはわかりません。)

_T_COMMAND_=1 "valgrind ---tool=memcheck --trace-children=yes command"

コマンドを次のように実行すると、同じことが機能します

$valgrind ---tool=memcheck --trace-children=yes command

何か案が?

4

1 に答える 1

2

コマンドを二重引用符で囲まないでください。

_T_COMMAND_=1 valgrind ---tool=memcheck --trace-children=yes command

一般的な構文は単純です

[var=value ...] cmd [args]

の期間、環境変数varをに設定します。この方法でいくつかの変数を設定できます。valuecmd

または、変数とexportそれを設定します。その後、現在のシェルの存続期間の残りの間設定されたままになり、サブプロセスに公開されます (これが のexport動作です)。

_T_COMMAND_=1
export _T_COMMAND_
valgrind ---tool=memcheck --trace-children=yes command

同様に、valgrindそのオプションを処理し、指定されたcommand(任意のオプションを含む) をサブプロセスとして実行します。

カーネルが引数を認識する前にシェルが引用符を削除するため、二重引用符で囲まれた単一のコマンドは無害です。二重引用符で囲まれたスペースを含む文字列は単一の引数として保持されますが、引用符がないと複数の引数になります。見よ:

bash$ perl -le 'print "<<$_>>" for @ARGV' "foo bar" baz quux
<<foo bar>>
<<baz>>
<<quux>>

または、まだ引用されていないすべてのものを二重引用符で囲みます。

bash$ "perl" "-le" 'print "<<$_>>" for @ARGV' "yowza"
<<yowza>>

シェルはこれを解析して

<<perl>>
<<-le>>
<<print "<<$_>>" for @ARGV>>
<<yowza>>

プロセス内の(外側の)引用符を削除します。

于 2013-09-27T10:07:58.553 に答える