역사적 확장을 인용해야 합니까?

역사적 확장을 인용해야 합니까?

방금 (따옴표 없이) 왔습니다 !$. 나는 이전에 이것을 본 적이 없으며 몇 가지 테스트를 수행했습니다.

$ ls -l
(...some output...)
$ echo !$
-l
$ echo "!$"
-l

man bash기록 확장 섹션에는 다음과 같이 나와 있습니다.

$마지막 단어. 이는 일반적으로 마지막 인수이지만 줄에 단어가 하나만 있는 경우 0번째 단어로 확장됩니다.

그럴 수 있지. 그런데 인용해야 할까요, 인용하지 말아야 할까요? 히스토리 확장에 대한 또 다른 테스트로 인해 다음과 같은 의문이 생겼습니다.

$ man bash
$ "!!"
"man bash"
bash: man bash: command not found

이것은 예상됩니다. 하지만 그러면 어쩌지 !$? 말이니까 인용해야 할 것 같은데...

(여기서 이 새 탭을 살펴보겠습니다..)

답변1

기록 확장에서 단어 주위에 따옴표 세트를 추가할지 여부에 따라 다릅니다.

가설 foo="abc def", 비교

$ echo $foo
$ printf "<%s>\n" !$

그리고

$ echo $foo
$ printf "<%s>\n" "!$"

전자는 를 생성하고 printf "<%s>\n" $foo, 단어 분할을 호출하고, printf형식 문자열 뒤에 두 개의 매개변수를 가져옵니다. 두 번째 것이 생성되는데 printf "<%s>\n" "$foo", 여기서 따옴표는 평소처럼 단어 분리를 방지합니다.

물론, 이 작업을 수행하려면 다음을 수행하십시오.

$ echo "$foo"

그런 다음 다음 명령의 a가 !$확장되어 "$foo"따옴표가 붙습니다. 이제 를 사용하면 따옴표가 효과적으로 서로 상쇄되는 위치가 "!$"생성됩니다 .""!$""

답변2

기록 대체는 마지막 단어, 따옴표 및 모두로 구문 분석된 모든 항목을 검색합니다.

$ echo this that "the other"
this that the other
$ echo !$
the other

다른 대체 항목을 검색하고 다시 실행할 수 있도록 먼저 실행됩니다.

$ echo `date`
Mon May 21 13:53:37 PDT 2018
$ echo !$
Mon May 21 13:53:38 PDT 2018

관련 정보