1

私は小さなスクリプトを作成しましたが、何らかの理由で、パラメーターで渡されたスペースをエスケープして機能させる必要があります。

この問題を抱えている人々に関する他の多くの記事を読みました。これは通常、$ @を引用しないことが原因ですが、すべての変数はスクリプト内で引用され、パラメーターもコマンドラインで引用されています。また、スクリプトをデバッグモードで実行すると、返される行はコピーアンドペーストで正常に実行できますが、スクリプト内から実行すると失敗します。

コード:

connections ()
{
    args="$@"
    pid="$(pgrep -nf "$args")"
    echo $pid
    # code that shows TCP and UDP connections for $pid
}
connections "$@"

例:

bash test.sh "blah blah"

失敗し、代わりに現在実行中のシェルのpidを返します

bash test.sh "blah\ blah"

成功し、pgrepを介して検索しているプロセスのpidを返します

4

1 に答える 1

1

あなたの問題はとは何の関係もありません"$@"

-lにオプションを追加すると、それが現在のプロセスと一致する理由pgrepがわかります。

実行しているスクリプトには、検索しようとしているものも独自の引数に含まれています

これをやって、見るようなものgrepです:

$ ps -U $USER -o pid,cmd | grep gnome-terminal
12410 grep gnome-terminal
26622 gnome-terminal --geometry=180x65+135+0

バックスラッシュが違いを生む理由は? pgrepバックスラッシュ+スペースは単にスペースを意味すると考えています。スクリプトが含まれているため、スクリプトが見つかりませblah\ blahblah blah

于 2012-04-04T01:25:26.310 に答える