
나는 오늘 다른 두 가지 질문에서 우연히 이 현상을 발견한 후 이 현상을 자세히 살펴보았습니다. 나는 기본적으로 이 모든 것을 시도했습니다 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 사이에서 누군가 이 문제를 해결했습니다.