$_와 !$의 차이점은 무엇인가요? [복사]

$_와 !$의 차이점은 무엇인가요? [복사]

나는 항상 !$이전 명령의 마지막 인수를 인용하곤 했습니다.

예를 들어

~/dir » mkdir birthday
~/dir » cd !$
~/dir » cd birthday

$_하지만 대신 사용되는 튜토리얼이 보이기 시작했습니다 .!$

둘 다 테스트했는데 유일하게 눈에 띄는 차이점은 미묘하지만 클릭하기 전에 출력을 확인하게 하면서 $_명령을 평가하고 실행하는 것 같은데, 그게 와 ?!$Enter$_!$

업데이트: 중복으로 표시하시겠습니까? 이 질문은 질문에 대해 허용된 답변을 제안함으로써 답변할 수 있지만, 이는 답변이 질문에서 요구하는 것보다 더 자세하기 때문입니다.

수색_$은 무슨 뜻인가요?제안의 사본을 생성하지만 수행된 작업을 묻기 전에 이미 알고 있었으며 !$이 질문이 다른 질문에도 답변된다는 표시는 없습니다.

답변1

실행 man bash및 검색 섹션특수 매개변수. 당신이 찾을 수 있기 때문에 _:

이전 명령의 마지막 인수로 확장됩니다.확장 후.

좀 더 자세한 버전은 다음과 같습니다.

이전 명령에서 받은 마지막 인수로 확장합니다(즉, 셸 확장을 수행한 후).

더 설명하는 것보다 몇 가지 예를 들어 보는 것이 정말 도움이 될 것 같습니다.

실시예 1

$ echo "$(date +%s)" # %s is seconds since epoch
1536984661
$ echo $_ !$ "$(date +%s)" # don't hit enter until a few seconds pass
1536984661 1536984665 1536984665

$_이전 에 전달된 실제 값을 가져오므 echo로 과거의 초 단위 값으로 확인됩니다. 또한, 이후는 !$단순히 다음으로 대체됩니다.타이핑된마지막 인수의 값, 즉 "$(date +%s)"뒤따르는 인수와 동일한 이후 시간으로 확인됩니다.

실시예 2

$ foo='a b c'
$ echo "$foo"  # expands to single arg: 'a b c'
a b c
$ echo "$_"
a b c
$ #---------
$ echo $foo    # expands to three args: a b c
a b c
$ echo "$_"
c

두 번째 응답 $foo에서는 인용되지 않았습니다. 따라서 echo변수/인수 확장 및 토큰화를 거쳐 전달됩니다. 이러한 확장/분할 결과는 다음과 같습니다.,두번째그리고세 개의 개별 인수로 전달되었으며 우리가 보는 마지막 인수만 할당되기 echo때문입니다.$_. ( !$사용하는 경우알파벳입력한 값(예: )으로 대체되었기 때문에 계속 표시됩니다 $foo. )

$_위의 것 외에도 vs는 !$전자이기 때문에 더 실용적인 가치가 있습니다.변수이다. 예를 들어 마지막 매개변수가 이면 /some/file/path.txt길이를 가져오고 ${#_} -> 19, 파일 이름만 추출하고 ${_##*/} -> path.txt, 루트 디렉터리를 변경하는 ${_//some/other} -> /other/file/path.txt등의 작업을 수행할 수 있습니다. 아무것도 사용할 수 없습니다 !$.


마지막으로, $_다른 상황에서는 다른 의미를 갖는다는 점에 유의하세요.

쉘이 시작되면 환경 또는 인수 목록에 전달된 쉘을 호출하는 데 사용되는 절대 경로 이름이나 실행 중인 쉘 스크립트로 설정하십시오.

...그리고...

또한 실행된 각 명령을 호출하고 해당 명령으로 내보낸 환경에 배치하는 데 사용되는 전체 경로 이름으로 설정됩니다.

...그리고...

메일 확인 시 현재 확인 중인 메일 파일의 이름을 저장하는 파라미터이다.

관련 정보