web-dev-qa-db-ja.com

パイプ標準出力からZenity通知

shutdown -P +60の標準出力をzenity --notificationにパイプしたいと思います。しかし、これは機能しません:

Sudo shutdown -P +60 | zenity --notification
1
user577728

適切なアプローチは次のことです。

$ pkexec shutdown -P +60 2>&1 | xargs -L1 -I %  zenity --width=250 --height=250 --info --text=%

次の結果:

enter image description here

進行中のいくつかの重要なことがあります。

  • とにかく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を実行する必要があります。通知ダイアログのキャンセルボタンはまったく役に立ちません。

8

この方法では、表示するテキストを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コマンドの置換によってキャプチャされないためです。

7
Byte Commander