튜토리얼을 읽고 있는데 다음 명령을 실행한다고 언급되어 있습니다.
sudo chmod 700 !$
나는 익숙하지 않다 !$
. 무슨 뜻이에요?
답변1
기본적으로 이전 명령의 마지막 매개변수입니다.
!$
이전 명령의 "끝"입니다. 다음 예를 고려하십시오. 먼저 파일에서 단어를 찾습니다.grep -i joe /some/long/directory/structure/user-lists/list-15
joe가 사용자 목록에 있으면 우리는 그를 제거하고 싶습니다. 긴 디렉토리 트리를 인수로 사용하여 vi를 시작하거나 간단히
vi !$
which bash가 다음으로 확장되는 것처럼 시작할 수 있습니다.vi /some/long/directory/structure/user-lists/list-15
(원천;그나저나 편리한 가이드)
!$
이 플래그와 특수 쉘 변수 사이의 구별은 의미가 없습니다 $_
. 물론,둘 다이전 명령의 마지막 매개변수로 확장합니다. 그러나 !$
그 동안 확장역사적 확장, $_
확장하는 동안매개변수 확장. 이것의 중요한 결과 !$
는 다음을 사용할 때 입니다.확장하다명령이 기록에 저장됩니다.
예를 들어 키 입력을 고려해보세요.
echo Foo
Enterecho !$ Jar
Enter Up Enter;그리고echo Foo
Enterecho $_ Jar
Enter Up Enter.
(변경되는 문자는 중간 $!
및 뿐입니다.)$_
전자에서는 를 누르면 Up명령줄이 읽혀지므로 echo Foo Jar
stdout에 기록되는 마지막 줄은 입니다 Foo Jar
.
후자의 경우 를 누르면 Up명령줄이 표시되지만 echo $_ bar
이제 $_
값이 이전과 다르고 $_
실제로는 now 이므로 Jar
stdout에 작성된 마지막 줄은 now 입니다 Jar Jar
.
또 다른 결과는 _
명령 시퀀스와 같은 다른 매개변수 확장에 사용될 수 있다는 것입니다.
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
인쇄 isomorphism isosceles
. 그러나 유사한 " " 확장자는 없습니다 ${!$%morphism}
.
Bash의 확장 단계에 대한 자세한 내용은 다음을 참조하세요 EXPANSION
.man 1 bash
쉘 확장온라인 버전에서는). 이 HISTORY EXPANSION
섹션은 별개입니다.
답변2
기술적으로 !$
기록 목록에 있는 마지막 명령의 마지막 단어입니다.
단어 - 쉘에서 하나의 단위로 처리되는 일련의 문자입니다. 단어에는 따옴표가 없는 메타 문자가 포함되어서는 안 됩니다.
메타 문자 - 인용되지 않은 단어를 구분하는 데 사용되는 문자입니다. 메타 문자는 공백이거나 "|", "&", ";", "(", ")", "<" 또는 ">" 문자 중 하나입니다.
공백 - 공백 또는 탭 문자입니다.
예:
set -o history # enable command history
set -o histexpand # enable ! style history substitution
HISTSIZE=10
# save all lines on the history list
HISTCONTROL=
HISTIGNORE=
date
echo !$ # prints date
date>/dev/null
echo !$ # prints /dev/null
echo a b c>/dev/null
echo !$ # prints /dev/null
HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
echo d e f # space at the beginning
echo !$ # prints c
답변3
!$
해당 특정 사용자가 사용한 마지막 명령을 제공합니다.
command를 사용하여 이전에 사용한 명령의 기록을 찾을 수도 있습니다 history
. 한번 시도해 보세요...
참고: 특정 사용자에 대해 이전에 사용한 모든 명령은 bash 기록 파일에 저장됩니다.