シェルスクリプトからpythonに文字列を返そうとしています。以下のエラーが発生します。
./whiptail.sh: 10: return: Illegal number: uuiiu
pythonを直接使用してwhiptailコマンドを実行しようとしましたが、その時点でもsubprocess.Popenを使用しています。Pythonからのユーザー入力を読み取ることができません。誰かがこれを試した場合は、これを解決する方法を教えてください問題。
シェルスクリプトスニペット
#!/bin/sh
COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
# A trick to swap stdout and stderr.
# Again, you can pack this inside if, but it seems really long for some 80-col terminal users.
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "User selected Ok and entered " $COLOR
return $COLOR
else
echo "User selected Cancel."
fi
echo "(Exit status was $exitstatus)"
Ubuntuでは実際にsh
であるdash
内で、組み込みコマンドreturn
は数値のみを返すことができます-関数またはソーススクリプトのコンテキストで意味を持つ終了ステータス。ソース man sh
:
Returnコマンドの構文は次のとおりです。
return [exitstatus]
シェルスクリプトの他のすべては正しいように見えます。 echo $COLOR
代わりにreturnして、他のエコーを抑制します。
より多くのデータをメインスクリプトに返す必要がある場合は、すべてを1行で出力し、個別のフィールドを、文字列を配列に変換できるベースとなるメインスクリプト内の区切り文字。たとえば(ここで,
は区切り文字であり、-n
はecho
内の改行文字を省略します):
echo -n "$COLOR","$exitstatus"
スクリプトによって提供され、メインスクリプトでは必要とされないその他の情報は、いくつかのログファイルにリダイレクトできます。
$ cat whiptail.sh
#!/bin/sh
log_file='/tmp/my.log'
COLOR=$(whiptail --inputbox "What is your favorite Color?" 8 78 Blue --title "Example Dialog" 3>&1 1>&2 2>&3)
exitstatus=$?
if [ $exitstatus = 0 ]; then
echo "User selected Ok and entered $COLOR" > "$log_file"
echo -n "$COLOR","$exitstatus"
else
echo "User selected Cancel." >> "$log_file"
echo -n "CANCEL","$exitstatus"
fi
残念ながら、Pythonの経験はあまりありませんが、上記の.shスクリプトの出力を処理できるサンプル.pyスクリプトを次に示します( 参照 ):
$ cat main-script.py
#!/usr/bin/python
import subprocess
p = subprocess.Popen(['./whiptail.sh'], stdout=subprocess.PIPE)
p = p.communicate()[0]
p = p.split(",")
print "Color: " + p[0]
print "ExitCode: " + p[1]