私は最近、他のコマンドにパラメータとしてファイルを渡す前に、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)
答え2
これはすでに去る2月バグとして報告されました。去る9月にもこのようなことが繰り返された。についてのメモがあります。Bash gitツリーの修正次の議論で。
^A
これは/\001
とDEL //の両方^?
で発生します\177
が、$'...'
プロセス内で交換する必要があるように見えるため、次のように問題を解決できます"$(printf "...")"
。
悪い:
$ od -c <( echo -n $'\x01_\x7f' )
0000000 001 001 _ 001 177
0000005
いいね:
$ od -c <( echo -n "$(printf '\x01_\x7f')" )
0000000 001 _ 177
0000003