Bashがコマンドの出力を引用符付き文字列として解釈するにはどうすればよいですか?

Bashがコマンドの出力を引用符付き文字列として解釈するにはどうすればよいですか?

グラフィックIU(私の場合はmacOSのFinder)からファイルを選択するプログラムがあります。出力は次のとおりです

'/tmp/file number one.txt' '/tmp/file number two.txt'

名前に空白文字があるため、ファイル名は '(シングルストレートチェック)で囲まれます.

bashのコマンド置換(例えばls -lコマンド)でこのコマンドの出力を使用すると、すべてが混乱します。テストのために、上記の行を単純な1行のテキストファイルに入れ、それをコマンドラインの代替手段として使用しました。

$ cat /tmp/files.txt
'/tmp/file number one.txt' '/tmp/file number two.txt'
$ ls -l $(</tmp/files.txt)
ls: "'/tmp/file: No such file or directory
ls: '/tmp/file: No such file or directory
ls: number: No such file or directory
ls: number: No such file or directory
ls: one.txt': No such file or directory
ls: two.txt'": No such file or directory

ファイル名文字列を変数に割り当てて使用する場合も同じことが起こります。

$ xxx="'/tmp/file number one.txt' '/tmp/file number two.txt'"
$ ls -l $xxx
ls: '/tmp/file: No such file or directory
ls: '/tmp/file: No such file or directory
ls: number: No such file or directory
ls: number: No such file or directory
ls: one.txt': No such file or directory
ls: two.txt': No such file or directory

この問題を解決する方法を知っていますか?エスケープされたファイル名をコマンドラインに直接コピーすると、期待どおりに機能します。

$ ls -l '/tmp/file number one.txt' '/tmp/file number two.txt'
-rw-r--r--  1 tester  wheel     0B Jul 17 17:21:11 2021 /tmp/file number one.txt
-rw-r--r--  1 tester  wheel     0B Jul 17 17:21:16 2021 /tmp/file number two.txt

私の究極の目標は、現在のFinderの選択(コンパイルされたApplescriptを介して得られた)をbashで使用できるようにすることです。たとえば、lsファイルリストやその他のファイル処理コンテンツを使用できます。tarcpmv

ベストアンサー1

遷移がオプションの場合は、zshこの目的のために設計されたzおよびパラメータ拡張フラグを使用できます。Q

file_content=$(</tmp/files.txt)
quoted_strings=(${(z)file_content})
strings_with_one_layer_of_quotes_removed=("${(Q@)quoted_strings}")
ls -ld -- "$strings_with_one_layer_of_quotes_removed[@]"

または、一度にすべての作業を実行してください。

ls -ld -- "${(Q@)${(z)$(</tmp/files.txt)}}"

ファイルで参照されている構文が同じであるとしますzsh

Z解析の実行方法を調整するには、パラメータの拡張も参照してください。たとえば、ファイルに#無視する必要があるコメントが含まれていて、2行以上の場合は、次のことを行う必要があります。

ls -ld -- "${(Q@)${(Z[Cn])$(</tmp/files.txt)}}"

info zsh flags詳細より。


zsh¹今、最新バージョンのmacOSでは、デフォルトのインタラクティブシェルと聞きました。

おすすめ記事