shutdown -P +60
の標準出力をzenity --notification
にパイプしたいと思います。しかし、これは機能しません:
Sudo shutdown -P +60 | zenity --notification
適切なアプローチは次のことです。
$ pkexec shutdown -P +60 2>&1 | xargs -L1 -I % zenity --width=250 --height=250 --info --text=%
次の結果:
進行中のいくつかの重要なことがあります。
とにかくGUIポップアップを使用するので、pkexec
の代わりにSudo
を使用してパスワードのGUIポップアップを作成します。
shutdown
コマンドは、stderrストリーム(ファイル記述子#2)に出力します。ただし、パイプはstdoutストリームのみを受け取ります。したがって、パイプ経由でstderrのコンテンツもリダイレクトする必要があります。それが2>&1
が行うことです。 (補足:bash
Shellでこれを使用する場合は、代わりに|&
のみを使用できますが、2>&1
はBournのようなシェルの大部分で動作します)
xargs
を使用すると、stdinストリームからコマンドライン引数を取得し、それらの引数を使用してコマンド(この場合はzenity --info
)を実行できます。 -L1
を使用すると、引数として1行を使用できます。したがって、shutdown
の出力は%
変数に格納され、zenity --width=250 --height=250 --info --text=%
に置き換えられます
zenity --notification
を使用していない理由は、キャンセルとOKの2つのボタンがあるためです。ただし、shutdown
コマンドの場合、キャンセルするにはshutdown -c
を実行する必要があります。通知ダイアログのキャンセルボタンはまったく役に立ちません。
この方法では、表示するテキストをzenity --notification
にパイプすることはできません。
man zenity
から:
Notification options
--text=STRING
Set the notification text
--listen
Listen for commands on stdin. Commands include 'message',
'tooltip', 'icon', and 'visible' separated by a colon. For exam‐
ple, 'message: Hello world', 'visible: false', or 'icon:
/path/to/icon'. The icon command also accepts the four stock
icon: 'error', 'info', 'question', and 'warning'
そのため、パイプするデータを何らかの形でmessage: COMMAND-OUTPUT
形式に変換し、--listen
オプションを使用するか、より単純なコマンドでメッセージを引数オプションとして--text=
に直接渡すことができます。
zenity --notification --text="$(shutdown -P +60 2>&1)"
出力をキャプチャするコマンドは、$( )
で囲まれています。これは、Bashの「コマンド置換」と呼ばれます。内部コマンドを実行し、その出力(標準出力ストリームのみ)がその代わりに入力されたかのように動作します。
また、内部コマンドの標準エラーストリームを標準出力ストリームにリダイレクトする2>&1
にも注意してください。これが必要なのは、shutdown
がその情報メッセージを標準エラーストリームに出力しますが、これはBashコマンドの置換によってキャプチャされないためです。