문제는 특수 변수에 관한 것입니다. 설명서에 따르면 :
!!:$이전 명령 의 마지막 인수를 지정합니다 . ! $로 단축 될 수 있습니다.
(
$_, 밑줄) 쉘 시작시 환경 또는 인수 목록에 전달 된대로 실행중인 쉘 또는 쉘 스크립트를 호출하는 데 사용되는 절대 경로 이름으로 설정하십시오. 이후 확장 후 이전 명령 의 마지막 인수로 확장됩니다. 또한 실행되어 해당 명령으로 내 보낸 환경에 배치 된 각 명령을 호출하는 데 사용되는 전체 경로 이름으로 설정하십시오.
내가 잡을 수없는 몇 가지 차이점이 있어야합니다.
$ 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, mksh및 dash경우에만 대화 형, ksh93두 명령은 분리 된 라인에있는 경우 :
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1