나는 최근에 다른 명령에 매개변수로 파일을 전달하기 전에 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가 사용되는 일부 기본 설정의 결과입니까?
나는 액세스할 수 있는 네 가지 다른 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