NULで区切られた変数

NULで区切られた変数

GNU bash、バージョン 4.4.19(1)-リリース(x86_64-pc-linux-gnu)

アイデアは、変数をNULで区切られたデータセットに設定することです。ここ$samples

しかし、結果は次のようになります。

警告:コマンドの置換:入力のnullバイトを無視します。

次のように扱う:

samples="$(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)"

同じ値を何度も繰り返す必要があるため、この変数を再利用できると思いました。

while IFS= read -rd '' sample; do
    echo $sample
done<<< "$samples"

私も\n入ることができます。\0探すこの場合、コマンドを実行しますが、可能であればNUL区切り文字を使用してこれを行う一般的な方法を知りたいです。

私は以下を選択できます。

while IFS= read -rd '' sample; do
    echo $sample
done< <(find . -type d -iregex './E[0-9][0-9]' -printf "%f\0" | sort -z)

しかし - 何度も繰り返す必要があるため、非常に重複するコードを生成して実行する必要があります。探すそしてタイプ毎回コマンドを発行します。

結果を配列に変換しますか?


  • 可能ですか?
  • NULを使用してデータをそのまま分離できないのはなぜですか?

答え1

実際、\0デフォルトのC実装のため、bash文字列コンテキストにnullバイトを格納することはできません。バラより$'\0' または $'\x0' が空の文字列であるのはなぜですか。 null 文字でなければなりません。そうですか?

1つのオプションは、sortコマンドの後にnullバイトを削除し、tr結果を使用してパイプの末尾に保存して警告メッセージを投げる即時の問題を解決することです。ただし、改行を含むファイル名はまだ混乱しているため、まだロジックに欠陥があります。

配列を使用すると、mapfileorコマンド(bash 4.4+)を使用してコマンドのreadarray結果を直接取得できます。find

IFS= readarray -t -d '' samples < <(find . -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)

答え2

シェルはbashあなたが望むものをサポートしていません。ケースはzsh箱から取り出し、すぐに使用できる状態で提供されます。

% mkdir sample11 SAMple12 sample21 sample22 dir1
% ll
total 20
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 dir1
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample11
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 SAMple12
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample21
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample22
% samples=$(find . -type d -iregex './sample[0-9][0-9]' -print0 | sort -z)
% echo $samples
./sample11./SAMple12./sample21./sample22
% echo $samples | od -a
0000000   .   /   s   a   m   p   l   e   1   1 nul   .   /   S   A   M
0000020   p   l   e   1   2 nul   .   /   s   a   m   p   l   e   2   1
0000040 nul   .   /   s   a   m   p   l   e   2   2 nul  nl
0000055
%

関連情報