GNU/Linux >> Linux の 問題 >  >> Linux

期待されるシェルスクリプトで生成されたプロセスの終了コードを取得するには?

wait で生成されたプロセスの終了ステータスを取得します コマンド:

expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)

lassign [wait] pid spawnid os_error_flag value

if {$os_error_flag == 0} {
    puts "exit status: $value"
} else {
    puts "errno: $value"
}
END
hello

exit status: 42

予想されるマニュアルページから

<ブロック引用>

待って [args]

<ブロック引用>

生成されたプロセス (名前が付けられていない場合は現在のプロセス) が終了するまで遅延します。

待って 通常、4 つの整数のリストを返します。最初の整数は、待機していたプロセスの pid です。 2 番目の整数は、対応するスポーン ID です。 3 番目の整数は、オペレーティング システム エラーが発生した場合は -1、それ以外の場合は 0 です。 3 番目の整数が 0 の場合、4 番目の整数は、生成されたプロセスによって返されるステータスです。 3 番目の整数が -1 の場合、4 番目の整数はオペレーティング システムによって設定された errno の値です。グローバル変数 errorCode も設定されます。

変更

expect {
"INVALID "  { exit 4 }
timeout     { exit 4 }
}

expect {
    "INVALID "  { exit 4 }
    timeout     { exit 4 }
    eof
}

次に lassign を追加します そして if コマンド。


グレンの助けを借りて、私は解決策を得ました..そして私の最終的なスクリプトは::

期待スクリプトは

 [Linux Dev:anr ]$ cat testexit.sh
 #!/bin/bash
 export tmp_script_file="/home/anr/tmp_script_temp.sh"
 cp /home/anr/tmp_script $tmp_script_file
 chmod a+x $tmp_script_file
 cat $tmp_script_file
 expect << 'EOF'
 set timeout -1
 spawn  $env(tmp_script_file)
 expect {
 "INVALID "  { exit 4 }
 timeout     { exit 4 }
 eof
 }

 foreach {pid spawnid os_error_flag value} [wait] break

 if {$os_error_flag == 0} {
     puts "exit status: $value"
     exit $value
 } else {
     puts "errno: $value"
     exit $value
 }
 EOF
 echo "spawned process status" $?
 rm -f $tmp_script_file
 echo "done"

生成されたスクリプト:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Expect スクリプトの実行:

 [Linux Dev:anr ]$ ./testexit.sh
 exit 3
 spawn /home/anr/tmp_script_temp.sh
 exit status: 3
 spawned process status 3
 done

グレンにもう一度感謝..


予想されるヒアドキュメント内の変数の展開に数日間苦労した後、最終的に、困っている人に役立つと思われる別のアプローチに出会いました。私の要件は、コマンドとパスワードをシェル関数に渡し、リモート ホストでコマンドをヒアドキュメントの期待の一部として実行し、戻り終了コードを取得することでした。

例:

function shell_function {
   # Get the command and password as arguments
   # Run command using expect
   # Return the exit code
}

shell_function <cmd> <password>
echo $?

他のみんなと同じように、ヒアドキュメント内の変数の展開は問題でした。そのためには、値を環境変数にエクスポートし、env を使用する必要がありました。 ヒアドキュメント内の変数を取得します。パスワードは引数の 1 つであったため、環境変数の一部として保存したくありませんでした。そのため、ヒアドキュメントの開始を一重引用符で囲む代わりに、ヒアドキュメントの変数がエスケープされています。これにより、渡された引数を直接使用できました。

以下は最終的なスクリプトです:

#! /bin/bash
# This function runs a command like 'ssh' and provides the password
function run_with_password {
    cmd="$2"
    paswd="$1"
    expect << END
        set timeout 60
        spawn $cmd
        expect {
            "yes/no" { send "yes\r" }
            "*assword*" { send -- $paswd\r }
        }
        expect EOF
        catch wait result
        exit [lindex \$result 3]
END
}

my_password="AnswerIS42Really?"
cmd_to_run="ssh [email protected]"
cmd_to_run="$cmd_to_run ls .sawfish"
run_with_password $my_password "$cmd_to_run"
echo "Command run code: $?"

上記のコードでは、エスケープされた期待変数は $result です .変数を \$result に変更した後 、スクリプトは魔法のように機能し始めました.

以下の質問に答えてくれたユーザーに心から感謝します.

Douglas Leeder:expect スクリプトのヘルプ、リモート comp で cat の実行、変数への出力の取得

グレン・ジャックマン:生成されたプロセスの終了コードを Expect スクリプトで返すには?


Linux
  1. シェルスクリプトで外部IPアドレスを取得する方法は?

  2. シェルスクリプトを暗号化またはレンダリングして判読不能にする方法は?

  3. 現在のgitブランチの名前をシェルスクリプトの変数に取得する方法は?

  1. シェルで PYTHONPATH を取得するには?

  2. nohupプロセスを強制終了するプロセスIDを取得するには?

  3. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

  1. 独自のIPアドレスを取得し、シェルスクリプトの変数に保存する方法は?

  2. 外部のpythonスクリプトでDjangoシェルでコードを実行するには?

  3. シェル スクリプトで外部 IP アドレスを取得するにはどうすればよいですか?