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