bash 中进程替换的输出重复 ^A 字符

Adr*_*onk 6 bash

我最近写了一个脚本,我想在将它作为参数传递给另一个命令之前用 sed 修改文件:

$ some-command <(sed $'s\x01foo\x01bar\x01g' some-file)
Run Code Online (Sandbox Code Playgroud)

这失败并出现错误:

sed: -e expression #1, char 8: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

经过一些实验,我发现 bash在调用 sed 之前复制了^A( \x01) 字符:

$ cat -v <(echo $'\x01')
^A^A
Run Code Online (Sandbox Code Playgroud)

^B(或其他)字符不会发生这种情况。

$ cat -v <(echo $'\x02')
^B
Run Code Online (Sandbox Code Playgroud)

这种行为记录在哪里?这是 ^A 用于模糊功能的某些默认设置的结果吗?

我在我可以访问的四个不同版本的 bash 中看到了这一点:4.1.2、4.2.25、4.2.46 (linux) 和 4.3.42 (cygwin)

ilk*_*chu 1

去年 2 月和去年 9 月,这已被报告为错误。在后面的讨论中,有一个关于Bash git 树中的修复的注释。

^A/\001和 DEL/ ^?/都会发生这种情况\177,但似乎需要$'...'在进程内进行替换,因此您可以使用"$(printf "...")"以下方法来解决它:

不好:

$ od -c  <( echo -n  $'\x01_\x7f' ) 
0000000 001 001   _ 001 177
0000005
Run Code Online (Sandbox Code Playgroud)

好的:

$ od -c  <( echo -n  "$(printf '\x01_\x7f')" )
0000000 001   _ 177
0000003
Run Code Online (Sandbox Code Playgroud)