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가 사용되는 일부 기본 설정의 결과입니까?

나는 액세스할 수 있는 네 가지 다른 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

관련 정보