$ _ vs! $. 이전 명령 및 출력 리디렉션의 마지막 인수 시작시 환경 또는 인수 목록에 전달 된대로

문제는 특수 변수에 관한 것입니다. 설명서에 따르면 :

!!:$

이전 명령마지막 인수를 지정합니다 . ! $로 단축 될 수 있습니다.


( $_, 밑줄) 쉘 시작시 환경 또는 인수 목록에 전달 된대로 실행중인 쉘 또는 쉘 스크립트를 호출하는 데 사용되는 절대 경로 이름으로 설정하십시오. 이후 확장 후 이전 명령마지막 인수로 확장됩니다. 또한 실행되어 해당 명령으로 내 보낸 환경에 배치 된 각 명령을 호출하는 데 사용되는 전체 경로 이름으로 설정하십시오.

내가 잡을 수없는 몇 가지 차이점이 있어야합니다.

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

차이점은 무엇입니까?



답변

!$역사 확장의 단어 지정자이며, 그것은에서 이전 명령의 마지막 단어로 확장 역사 . IOW는 역사에서 이전 항목의 마지막 단어입니다. 이 단어는 일반적으로 명령의 마지막 인수이지만 리디렉션의 경우에는 해당되지 않습니다. 에서:

echo "hello" > /tmp/a.txt

전체 명령 'echo "hello" > /tmp/a.txt'은 역사에 나타 났으며 /tmp/a.txt그 명령의 마지막 단어입니다.

_쉘 매개 변수이며 이전 명령의 마지막 인수로 확장됩니다. 여기서 리디렉션은 명령에 전달 된 인수의 일부가 아니므로 인수 만 hello전달됩니다 echo. 그래서 $_확장되었습니다 hello.

_더 이상 쉘 표준 특수 매개 변수 중 하나가 아닙니다 . 그것은 작동 bash, zsh, mkshdash경우에만 대화 형, ksh93두 명령은 분리 된 라인에있는 경우 :

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1