スペースを含む改行で区切られたリストをパラメータに変換

スペースを含む改行で区切られたリストをパラメータに変換

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

おすすめ記事