저는 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의 정식 답을 보았으며 가능한 많은 이유를 발견했지만 아무도이 동작과 일치하지 않습니다.
마지막 줄은 인용 부호가있는 문자열을 포함하는 대신 단일 행으로 분석됩니다. '!'는 큰 따옴표 안에있는 것처럼 처리됩니다. 또한이 줄이 인식되는 것을 기다릴 때 다음 줄에'>'를 얻을 것입니다. 이것이 단일 라인에서도 작동하는 이유입니다. 버그 같아. – 123
4.2.47에서 재현 가능. 나는 버그를 신청할 것이다. – choroba
'3.2.51'까지 다시 복제 할 수 있습니다 – 123