0

私はこの bash ワンライナーを作成しました。これを使用して、実行中の Weblogic インスタンスを完全なパスとともにリストします。これは、シェルから実行するとうまく機能します。

/usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print $2}' | sed 's/weblogic.policy//' | sed 's/security\///' | sort

これをexpectスクリプトに組み込んでみました

send "echo Weblogic Processes: ; /usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print \$2}' | sed 's/weblogic.policy//' | sed 's/security\///' | sort ; echo ; echo\r"

しかし、私はこのエラーを受け取りました sed: -e expression #1, char 13: unknown option to `s'

助けてください

4

5 に答える 5

2

おそらく\登場人物は

sed 's/security\///'

予期されるコンテキストで追加のエスケープが必要です。たとえば、

send "echo Weblogic Processes: ; /usr/ucb/ps auwwx | grep weblogic | tr ' ' '\n' | grep security.policy | grep domain | awk -F'=' '{print \$2}' | sed 's/weblogic.policy//' | sed 's/security\\///' | sort ; echo ; echo\r"
于 2010-03-17T12:25:10.027 に答える
1

送信する文字列を二重引用符で囲む代わりに、Tclの{}演算子を使用します。Tclの{}構文は、bashの単一引用符と同等であり、「リテラル文字列、その内容を解釈しない」ことを意味します。

{}の中に、Tcl / Expectがサブプロセスに送信するものを、文字ごとに正確に入力します。追加の引用符は必要ありません。

于 2010-04-08T13:14:34.553 に答える
1

慎重に数えたりテストしたりせずに\、「security\」の後に別のものを追加するか、既存のものを削除してみます。

また、2 つの sed を 1 つに結合することもできます。sed -e 's/weblogic.policy//' -e 's/security\///'

于 2010-03-17T12:46:49.633 に答える
0

これは複雑すぎてリモート ホストに送信できないと思います。代わりに、コマンドを小さなシェル スクリプトに入れて実行します。こうすれば、引用展開ルールやエスケープなどによるトラブルに遭遇することはありません。

さらに、スクリプトを実行するssh代わりに使用する必要があります。適切なスクリプト機能を持たないような対話型コマンドを実行するためのものです。expectexpectftp

于 2010-03-17T12:31:07.013 に答える
-1

一重引用符を削除して、コマンドを再実行してみてください。

send "....... sed s/weblogic.policy// | sed s/security\/// ..."

おそらく引用の問題です。うまくいかない場合は、次の提案を試してくださいhlovdal

一方、長いコマンドのいくつかは組み合わせることができます

/usr/ucb/ps auwwx |grep weblogic| tr ' ' '\n'|awk '/security.policy/&&/domain/{gsub("weblogic.policy|security","",$2);print $2}|sort 
于 2010-03-17T12:23:12.263 に答える