Bashのプロセス置換出力は^ A文字を繰り返します。

Bashのプロセス置換出力は^ A文字を繰り返します。

私は最近、他のコマンドにパラメータとしてファイルを渡す前に、sedを使用してファイルを変更するスクリプトを作成しました。

$ some-command <(sed $'s\x01foo\x01bar\x01g' some-file)

次のエラーが原因でこの操作は失敗します。

sed: -e expression #1, char 8: unknown option to `s'

いくつかの実験の終わりに、bashがsedを呼び出す前に^A()文字をコピーするという事実を見つけました。\x01

$ cat -v <(echo $'\x01')
^A^A

^B(またはその他)文字ではこれは発生しません。

$ cat -v <(echo $'\x02')
^B

この動作はどこに文書化されていますか?これは、ぼかしに^ Aが使用されているいくつかのデフォルト設定の結果ですか?

私はアクセス可能な4つの異なるbashバージョン(4.1.2、4.2.25、4.2.46(linux)、4.3.42(cygwin))でこれを見ました。

ベストアンサー1

はい、\x01パラメータ拡張の内部で使用すると繰り返されます。

$ cat -v <(echo $'\x01')
^A^A

これは、2.05以降のbashバージョンでも発生します。

$ ./script
zsh/sh          : ^A
b203sh          : ^A
b204sh          : ^A
b205sh          : ^A
b30sh           : ^A^A
b32sh           : ^A^A
b41sh           : ^A^A
b42sh           : ^A^A
b43sh           : ^A^A
b44sh           : ^A^A
ksh93           : ^A
attsh           : ^A
zsh/ksh         : ^A
zsh             : ^A

パイプラインではこれは発生しません。

$ echo $'\x01' | cat -v
^A

解決策:

したがって、コードを次のように書き直すことができます。

$ echo $'\x01' | some-command

または:

$ some-command <(sed $'s\x02foo\x02bar\x02g' some-file)

おすすめ記事