我最近写了一个脚本,我想在将它作为参数传递给另一个命令之前用 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)
去年 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)