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