2016-06-14 5 views
7

저는 GNU bash 버전 4.3.11입니다.멀티 라인, 큰 따옴표 붙은 문자열은 뒤따라 오는 작은 따옴표 붙은 명령에서 히스토리 확장을 트리거합니다.

말 파일에 고유 한 줄을 인쇄하고 싶습니다. 내가 파일에 잘 작동이 방법을 사용하고 있습니다 : AWK에 멀티 라인 및 배관에 따옴표를 사용하여, 나는 표준 입력에서 입력을받을 경우,

$ cat a 
9 
10 
9 
11 
$ awk '!seen[$0]++' a 
9 
10 
11 

그러나을은 실패

$ echo "9 
> 10 
> 9 
> 11" | awk '!seen[$0]++' 
bash: !seen[$0]++': event not found 

즉 bash는 변수 이름이기 때문에 물론 알 수없는 명령어 seen을 확장하려고 시도합니다. 명령은 작은 따옴표 안에 있기 때문에 일어날 수 없습니다. 단일 인용, 멀티 라인 입력에 보내고

echo 잘 작동 :

$ echo '9 
> 10 
> 9 
> 11' | awk '!seen[$0]++' 
9 
10 
11 

재미있는 것은이 또한 큰 따옴표 단일 - 라인 입력에 잘 작동한다는 것입니다 :

$ printf "9\n10\n9\n11" | awk '!seen[$0]++' 
9 
10 
11 

왜 Bash는 커맨드 자체가 작은 따옴표를 사용하더라도 배타적으로 입력이 끝난 후에 발생하면 히스토리를 확장하려고합니다.

기타 고려 사항 :

를 해결하지 않는 사이에 파이프를 갖는

, 다음 중 하나를

$ echo "9 
> 10 
> 9 
> 11" | cat - | awk '!seen[$0]++' 
bash: !seen[$0]++': event not found 

그리고 set +H turns history off을 설정, 그래서 아무것도 확장하려고하지 않기 때문에 그것을 잘 작동 :

$ set +H 
$ echo "9 
> 10 
> 9 
> 11" | awk '!seen[$0]++' 
9 
10 
11 

나는 how to address error “bash: !d': event not found” in Bash command substitution에 rici의 정식 답을 보았으며 가능한 많은 이유를 발견했지만 아무도이 동작과 일치하지 않습니다.

+1

마지막 줄은 인용 부호가있는 문자열을 포함하는 대신 단일 행으로 분석됩니다. '!'는 큰 따옴표 안에있는 것처럼 처리됩니다. 또한이 줄이 인식되는 것을 기다릴 때 다음 줄에'>'를 얻을 것입니다. 이것이 단일 라인에서도 작동하는 이유입니다. 버그 같아. – 123

+1

4.2.47에서 재현 가능. 나는 버그를 신청할 것이다. – choroba

+0

'3.2.51'까지 다시 복제 할 수 있습니다 – 123

답변

2

이것은 버그가 아닙니다.

역사 확장을 명시 적으로 라인 지향 :

메일 링리스트 bash는-버그이 요청 후, 나는 다음과 같은 대답을 얻었다.

셸 상태, 특히 셸 인용 상태 인 줄을 포함하는 에 대해 알지 못합니다.

그것은 막연 껍질 같은 그 유닉스 유틸리티 대형 세트에서 공통의 인용에 대해 알고 않습니다

- 역사 이후와 라이브러리가 쉘 외부에서 사용하는 readline에 - 그리고 따옴표 가에 인용 된 문자열을 소개하는 것이 작은 따옴표는 의미가 없습니다. 및 기록 확장을 금지하지 않습니다.

+2

이 문서화에 대한 Upvote,하지만 그건 미친 행동. – tripleee