FC2ブログ

本を読む

読書やコンピュータなどに関するメモ

Nautilusスクリプトのシェルスクリプトでファイル名を受け取る

 GNOMEのファイルマネージャーであるNautilus(ファイル)には、Nautilusスクリプトという仕組みがあります。Nautilusスクリプトを使うと、コンテキストメニュー(右クリックメニュー)から、Nautilus上で選択している1つまたは複数のファイル名を参照して、コマンドを実行できます。

 このNautilusスクリプトをシェルスクリプトで作る場合を考えます。題材としては、xzコマンドを1度だけ実行して、全ファイルを引数で渡す場合とします。なお、ファイル1つごとにxzコマンドを実行するものではありません(実用上はそれで問題ないのですが)。

ファイル名の受け取り方

 ファイル名のリストは、環境変数NAUTILUS_SCRIPT_SELECTED_FILE_PATHSで、1行1ファイル名の形式で渡されます。そのため、素朴な実装としては、次のように書けます。

#/bin/sh
xz $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS

 ただし、ファイル名に空白などが入っていると、そこで別の引数に区切られてしまいます。いやー、IFSとかで引数展開の区切りを指定できて、"$@"形式で展開できるといいんですが。たとえばこんな感じにできれば。

#/bin/sh
IFS='
' set -- $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
xz "$@"             # これはうまくいかない

 Bashの機能を使うのであれば、配列を使って書けるんですが。

#/bin/bash
mapfile -t ary <<<"$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
xz "${ary[@]}"

 まあこれ以上はPythonとかを使ったほうがいいでしょうね。

@satoh_fumiyasuさんの解

 てなことをTwitterでつぶやいたら、@satoh_fumiyasuさんがシェルで実現する解を考えてくれました

 ざっくりいうと、ラッパー関数を作り、それを呼び出すときにIFSを指定する方法ですね。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1525-b05bc63b

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly