:ここ
$ touch $'a\nb' $'c\nd'
$ ls -Q --quoting-style=escape ??? | while IFS= read -r fname; do echo =="${[email protected]}==="; done
==a
b==
==c
d==
は、(生のソースにあるリンク)
man pageの関連する部分であります2つの例外:
- バックスラッシュを付加することでスペースを逃します。
$'...'
はスペースの前にバックスラッシュを破棄しません。
- シングルクォートをエスケープしません。
だからあなたはおそらく(バッシュで)このような何かを書くことができ:
function ls-quote-shell() {
ls -Q --quoting-style=escape "[email protected]" \
| while IFS= read -r filename ; do
filename="${filename//'\ '/ }" # unescape spaces
filename="${filename//"'"/\'}" # escape single-quotes
printf "$'%s'\n" "$filename"
done
}
これをテストするために、私は奇妙な文字を含むファイル名の束を持つディレクトリを作成しました。および
eval ls -l $(ls-quote-shell)
が意図したとおりに機能します。 。 。私はそれについて確かな保証はしませんが。
また、ここではシェルに優しい方法で再脱出にprintf %q
続くエスケープを処理するためにprintf
を使用したバージョンです:
function ls-quote-shell() {
ls -Q --quoting-style=escape "[email protected]" \
| while IFS= read -r escaped_filename ; do
escaped_filename="${escaped_filename//'\ '/ }" # unescape spaces
escaped_filename="${escaped_filename//'%'/%%}" # escape percent signs
# note: need to save in variable, rather than using command
# substitution, because command substitution strips trailing newlines:
printf -v filename "$escaped_filename"
printf '%q\n' "$filename"
done
}
はそれが最初のバージョン、一部のケースがあることが判明した場合が正しく処理されない場合は、2番目のバージョンで同じ問題が発生する可能性が高くなります。 (FWIW、eval ls -l $(ls-quote-shell)
は両方のバージョンで意図したとおりに動作しました)
'--quoting-style =" escape "'または '--quoting-style =" c "'は動作するはずです... –
@ l'L'l:そうではありません。 'eval ls $(ls -Q --quoting-style = escape)'は 'ls:anbにアクセスできません:そのようなファイルやディレクトリはありません 'を返すので、ラウンドトリップしません。 'eval'なしでは動作しません。 – choroba
'c'はおそらくあなたの最善の賭けになるでしょう...また、いつでもあなたはサブ殻の中で奇妙な結果を得るだろうと思っています。 –