Bash: 같은 줄 내에서 큰 따옴표 뒤의 작은 따옴표 내 기록 확장

Bash: 같은 줄 내에서 큰 따옴표 뒤의 작은 따옴표 내 기록 확장

나는 오늘 다른 두 가지 질문에서 우연히 이 현상을 발견한 후 이 현상을 자세히 살펴보았습니다. 나는 기본적으로 이 모든 것을 시도했습니다 set -H(기록 확장이 켜져 있음).

스크립트를 테스트하기 위해 여러 줄 문자열을 입력하고 스크립트를 통해 파이핑하는 등의 작업을 자주 수행 echo하지만 어떤 경우에는 오류가 발생합니다.

$ echo "foo
bar" | sed '/foo/!d'
bash: !d': event not found
> 

!작은따옴표로 묶여 있음에도 불구하고 기록 확장을 유발하는 것 같습니다. 문제는 같은 줄에 큰따옴표가 있다는 것입니다.

$echo $'foo\nbar' | sed '/foo/!d'

효과도 너무 좋아요

$echo "foo
bar" |
> sed '/foo/!d'

내 의심: 기록 확장이 한 줄씩 적용되므로 '다음 싱글은 "이스케이프된 것으로 간주되므로 다음은 !이스케이프되지 않습니다.

이제 내 질문은 이것이 버그입니까, 아니면 예상되는 동작입니까?입니다. 복제된 bash버전은 4.2.30 및 4.4.12입니다.

답변1

에 신고 [email protected]해서 받았어요답변:

역사의 확장은 분명히 경로 지향적이며 항상 그래왔습니다. 쉘의 현재 참조 상태를 알 수 있는 명확한 방법은 없습니다(주로 쉘 독립 라이브러리이기 때문입니다). 아마도 기존 콜백 함수 중 하나를 사용하여 이를 수행하는 방법이 있을 수 있습니다.

나에게는 이 말이 "현재 구현으로는 더 나은 결과를 얻을 수 없기 때문에 이것은 버그가 아닙니다.".

고쳐 쓰다

직업을 바꾼 후 나는 그 주제에 대한 관심을 잃었습니다 zsh. 이제 버전 5.1.4를 사용해 보았는데 bash문제가 더 이상 재현되지 않는 것으로 나타났습니다. 따라서 4.4.12와 5.1.4 사이에서 누군가 이 문제를 해결했습니다.

관련 정보