1

私はシェル スクリプトに関しては比較的初心者ですが、プログラミングに関してはそうではありません。

whileBashスクリプトのバグの真相を突き止めようとして、サブシェルの問題を回避するために、プロセス置換と「here文字列」をループに供給するSTDINの使用の3つの短い例を思いつきました。

find異常なファイル名文字との潜在的な闘争を避けるために、出力をヌル区切りにしています。

この例はうまく機能し、ルートにあるすべてのフォルダーの名前を出力します。

#!/bin/bash
while IFS= read -r -d '' y; do echo "${y}"
done < <(find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z)

この例もうまく機能します:

#!/bin/bash
find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z | \
{ while IFS= read -r -d '' y; do echo "${y}"; done }

しかし、この場合、find出力を文字列に保存し、xそれを「ここの文字列」のソースとして使用しようとすると、何も出力されません。

#!/bin/bash
x=$(find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z)
while IFS= read -r -d '' y; do echo "${y}"; done <<< "${x}"

ここで見逃している繊細さ (または私の部分の密度) は何ですか?

GNU bash 4.1.7(2) リリースを使用しています。

4

2 に答える 2

1

文字列をパラメーターに割り当てると、文字列の末尾は最初の null 文字で終了します。ただし、シェルは、任意のバイト ストリームを読み取ることができる標準入力を介して、ヌル文字を含む文字列を渡すことができます。

于 2013-10-24T20:17:14.220 に答える
1

bash の文字列は C 文字列に似ており、null で終了します。これは、出力を変数に割り当てようとしたときに機能しない理由を説明するはずです。

実験として、あなたは試すことができます

a=$'foo\0bar'
echo "$a"
于 2013-10-24T20:18:13.720 に答える