スペースを含むファイル名のバックティックの置き換え

スペースを含むファイル名のバックティックの置き換え

たとえば、スペースを含むファイル名があるとしますwith space。 「空白を含む」を引数として受け入れるcmd次のコードでは、何を出力する必要がありますか?ls

$ ls `cmd`

私は努力したls `echo 'with space'`。に渡されるパラメータはとlsです。バックスラッシュを使用してスペースを抜けようとしても機能しません。使い方がうまくいくと思います。ただし、空白を含む可能性のある一部のファイルに複数のファイルを引数として渡したい場合は機能しません。'withspace'ls "`cmd`"ls

コマンドの置き換えに関するマニュアルもまれです。https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

より一般的には、cmdが他のコマンドで使用するためにバックティック置換を使用して置き換えることができるファイルのリストを出力したい場合、cmdが従う出力形式は何ですか?

答え1

使い方がls "`cmd`"うまくいくと思います。ただし、複数のファイルをlsの引数として渡したい場合は機能しません。

いいですね。これはコマンドを変数に保存するのと同じ問題です(すでに議論されています)。たとえば、ここ)、本当にうまくできません。思い出させるオプションは次のとおりです。

  • cmdNULで区切られたファイル名のリストを出力し、xargs -0それを別のコマンドにパイプします。
  • IFSどんなファイル名にも出ない文字に設定し、cmdこれに区分してファイルリストを出力する。
  • 出力はcmdシェルから正しく引用されてからeval

このように:

$ touch "with space" "another space"
$ printf "%s\0" "with space" "another space" | xargs -0 ls -i
1705749 another space  1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space  1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space  1705230 with space

find -exec ...または交換が可能な場合は使用してくださいcmd

関連情報