! $은 무슨 뜻인가요?


32

튜토리얼을 따르고 있으며이 명령을 실행하는 것에 대해 언급합니다.

sudo chmod 700 !$

에 익숙하지 않습니다 !$. 무슨 뜻이에요?


5
echo무엇을해야할지 확실치 않은 경우 에는 시도해 보는 것이 일반적으로 안전합니다 .
Shadur

8
@Shadur, 항상 그런 것은 아닙니다. echo $(rm -rf /)
CJM

1
@cjm 당신이 정말로 오래된 시스템에 있지 않다면, --no-preserve-root거기에 옵션 이 필요할 것입니다. 그리고 프로그램에서 "보존하지 않음"이라는 단어를 보게되면, 그것이 무엇을하는지 신중하게 생각하는 것이 좋습니다.
wchargin

4
@WChargin "정말 오래된 것"과 "리눅스가 아닌 것 / GNU coreutils를 사용하지 않는 것"이 ​​같은 것이라고 가정하면 매우주의해야합니다. 그렇지 않습니다.
Chris Down

답변:


44

기본적으로 이전 명령에 대한 마지막 인수입니다.

!$이전 명령의 "종료"입니다. 다음 예제를 고려하십시오. 파일에서 단어를 찾는 것으로 시작합니다.

grep -i joe /some/long/directory/structure/user-lists/list-15

joe가 해당 사용자 목록에 있으면 제거합니다. 긴 디렉토리 트리를 인수로 사용하거나 vi를 vi !$bash가 확장하는 것처럼 vi를 실행할 수 있습니다 .

vi /some/long/directory/structure/user-lists/list-15

( 출처 : 편리한 가이드)


!$토큰과 특수 쉘 변수 의 차이점은 없습니다 $_. 실제로 둘 다 이전 명령의 마지막 인수로 확장됩니다. 그러나 !$시 확장 역사를 확장 하면서, $_시 확장 매개 변수 확장 . 이 중 한 가지 중요한 결과는 사용할 때,이다 !$확장 명령이 기록에 저장됩니다.

예를 들어, 키 입력을 고려하십시오

  • echo Foo Enter echo !$ Jar Enter Up Enter; 과

  • echo Foo Enter echo $_ Jar Enter Up Enter.

( $!및 변경된 문자 $_는 중간에 있습니다.)

전자에서을 누르면 Up명령 행이 echo Foo Jar이므로 stdout에 기록 된 마지막 행은 Foo Jar입니다.

후자의 경우을 누르면 Up명령 줄이을 읽지 echo $_ bar만 이제는 $_이전과 다른 값을 가지게되므로 실제로 $_Jar이므로 stdout에 기록 된 마지막 행은 Jar Jar입니다.

다른 결과는 _다른 매개 변수 확장 (예 : 명령 순서)에 사용될 수 있다는 것입니다.

printf '%s '    isomorphism
printf '%s\n'   ${_%morphism}sceles

인쇄합니다 isomorphism isosceles. 그러나 유사한 " ${!$%morphism}"확장 은 없습니다 .

Bash의 확장 단계에 대한 자세한 내용은 온라인 버전에서 셸 확장 이라고 하는 EXPANSION섹션을 참조하십시오 . 부분은 별개입니다.man 1 bashHISTORY EXPANSION


6
좋은. 알아 둘만 한. 또한 스택 교환이 있습니다. !$
Andrew

4
BTW의 명령 행 insert-last-argument에서으로 보통 이전 명령의 마지막 인수를 삽입 할 수 있습니다 M-..
choroba

1
@Andrew 귀하의 질문에 대한 답변이 있으면이를 받아주십시오. 의견을 게시하는 대신 수락하고 투표하는 것은 SE 네트워크에서 감사가 표현되는 방식 입니다. "공식적인"자세는 여기 를 참조 하십시오 .
terdon

1
@Andrew FYI는 Google에서 "bash bang dollar"을 검색했으며이 링크를 세 번째 목록으로 포함하여 괜찮은 결과를 얻었습니다.
wchargin

1
@ terdon 나는 어젯밤에 대답을 받아들이려고했지만 너무 빨라서 그것을 기다려야했습니다.
앤드류

4

엄밀히 말하면 !$기록 목록에서 마지막 명령의 마지막 단어입니다.

단어-쉘에서 단위로 취급되는 일련의 문자. 단어에는 따옴표없는 메타 문자를 포함 할 수 없습니다.

메타 문자-인용 부호가 없을 때 단어를 구분하는 문자입니다. 메타 문자는 공백이거나 '|', '&', ';', '(', ')', '<'또는 '>'문자 중 하나입니다.

공백-공백 또는 탭 문자.

예 :

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

!$ 특정 사용자에게 사용 된 마지막 명령을 제공합니다 ....

당신은 또한 명령을 사용하여 이전에 사용 된 history명령 의 역사를 찾을 수 있습니다 ... 그것을 사용해보십시오 ....

참고 : 특정 사용자의 경우 이전에 사용 된 모든 명령이 bash 기록 파일에 저장됩니다.


1
다른 대답은 옳습니다. 이것은 잘못된 것입니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.