$a"\0"$b"\0"$c"\0"$d
私は$ a、$ b、$ c、$ dなどの引数を受け入れ、それを標準出力に書き込むCLIツールを探しています。 CLIでパイプラインの先頭に使用できる標準ツールはありますか?私の実装では、カスタムecho
区切り文字を受け入れないようです。
答え1
printf
この問題は、ほとんど次のように解決できます。
printf "%s\0" "$a" "$b" "$c" ...
printf
必要に応じて対応する書式文字列を繰り返します(この場合は各パラメータに対して1回)。これにより、各パラメータの後にヌルバイトが続きます。
最後のヌルバイトを削除するには、GNUを使用してくださいhead
。
printf "%s\0" "$a" "$b" "$c" ... | head -c-1
Zshの組み込み機能print
も後処理なしでこれを行うことができます。
print -rNn "$a" "$b" "$c" ...
(-r
エスケープ処理を無効にし、-N
引数をnullバイトで区切って終了し、-n
端末の改行を無効にします。ありがとうございます。スチールドライバーヒントをください! )
答え2
このprintf
コマンドは必要に応じてフォーマットを繰り返すので、次のことができます。
print "%s\0"
私たちは実際にそれを見ることができます:
$ printf "%s\0" hello there | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 ere.
$ printf "%s\0" hello there everyone out there | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 65 76 65 72 ere.ever
00000010 79 6F 6E 65 00 6F 75 74 yone.out
00000018 00 74 68 65 72 65 00 .there.
また、文字列の末尾に端末 NUL を配置することに注意してください。これを望まない場合は削除できます。sed 's/.$//'
$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000 68 65 6C 6C 6F 00 74 68 hello.th
00000008 65 72 65 00 65 76 65 72 ere.ever
00000010 79 6F 6E 65 00 6F 75 74 yone.out
00000018 00 74 68 65 72 65 .there