Caja(ノーチラスレプリカ)のコンテキストメニューから実行できるスクリプトを作成しようとしています。その目的は、ファイルマネージャで選択したファイルを特定のプログラム(7zipなど)に渡すことです。選択したファイルの$CAJA_SCRIPT_SELECTED_FILE_PATHS
改行で区切られたリストがシステム変数に提供されます。この変数のすべての行にスペースが含まれていても、パラメータとしてプログラムに渡したいと思います。
見積パッケージが失敗した後、次の行を試しました。
echo "$CAJA_SCRIPT_SELECTED_FILE_PATHS" | xargs -d "\n" 7z a archive.7z
私は7zipでは動作しますが、私が書いたプログラムに引数を渡すようにスクリプトを変更しましたが、問題が発生したため、端末でこのスクリプトを実行してプログラムの出力を取得する方法を望んでいます。を使用していますが、xterm -hold -e
シェルはxtermの出力をパイプしようとするため、パイプを持つコマンドをこの方法で実行することはできません。私は(行の> log.txt
末尾に追加して)シェルリダイレクトを試み、7zipの一般的な出力用のファイルを生成しましたが、端末にメッセージを正常に出力する私のプログラム用の空のファイルを生成しました。
最後に、BSDとLinuxで同じように動作できるように、POSIX(または他の標準)互換のソリューションが必要です。
編集:明確にするために、次のように変更したいと思います。
/path/with/a space
/another/path
次のようなことから何が得られるのか教えてみましょう。
char *argv[]={"/path/with/a space", "/another/path"};
EDIT2:これはシェルではなくパラメータを受け取るプログラムの外観です!
答え1
Bashを使用したい場合は、ここでIFS
改行を設定してread
文字列を配列に分割できますCAJA_SCRIPT_SELECTED_FILE_PATHS
。"${a[@]}"
その後、個別にまたはループから配列要素にアクセスできます(組み込みスペースは保存されます)。
CAJA_SCRIPT_SELECTED_FILE_PATHS='a
b c
d
f
g'
IFS=$'\n' read -d '' -r -a a <<< "$CAJA_SCRIPT_SELECTED_FILE_PATHS"
printf "%s\n" "${a[0]}"
a
printf "%s\n" "${a[1]}"
b c
printf "%s\n" "${a[@]}"
a
b c
d
f
g
答え2
空白をそのままにしてstdinを読み、改行文字に分割する方法は次のとおりです。
ダッシュでテストしました。
#!/bin/dash
while IFS= read -r line; do
set -- "$@" "$line"
done
printf "have arg '%s'\n" "$@"
答え3
Glenn Jackmanの答えで役に立つものを手に入れようとすると、$ IFSが何であるかがわかりました。これが私に必要なようです。
今は次のスクリプトがあります。
#!/bin/sh
IFS='
'
uxterm -hold -e ./program_to_test $CAJA_SCRIPT_SELECTED_FILE_PATHS
./program_to_test
引数を個々のハイライトとして印刷するBASHスクリプトを置き換えることで動作することを確認しました。 Cajaで上記のスクリプトを実行すると、xtermウィンドウが表示され、選択したファイルのパスがすべて強調表示されます。ハイライトの間にはスペースがありますが、ファイル名の単語の間にスペースはありません。したがって、各行がパラメータになります。
実際、Bourneのようなシェル以外には何も必要ない方法があることに驚きました。たぶん私はこのツールに十分な信用を与えていないかもしれません。