문제는 특수 변수에 관한 것입니다. 설명서에 따르면 :
!!:$
이전 명령 의 마지막 인수를 지정합니다 . ! $로 단축 될 수 있습니다.
(
$_
, 밑줄) 쉘 시작시 환경 또는 인수 목록에 전달 된대로 실행중인 쉘 또는 쉘 스크립트를 호출하는 데 사용되는 절대 경로 이름으로 설정하십시오. 이후 확장 후 이전 명령 의 마지막 인수로 확장됩니다. 또한 실행되어 해당 명령으로 내 보낸 환경에 배치 된 각 명령을 호출하는 데 사용되는 전체 경로 이름으로 설정하십시오.
내가 잡을 수없는 몇 가지 차이점이 있어야합니다.
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
차이점은 무엇입니까?
4
! $는 특수 변수가 아닌 히스토리 확장이므로 bash 코드가 다르게 처리한다고 가정합니다.
—
Jeff Schaller
나는이 질문에 확실한 대답을 가지고 있지만하지 않습니다 : ① Bourne 쉘 언어 중 하나, 아마도 여전히 오늘날 널리 사용되는, 적어도 내부적으로 일관성이 프로그래밍 언어. 일반적인 원칙을 추론하려고하면 아무데도 갈 수 없습니다. 모든 특별 규칙을 암기해야합니다. 죄송합니다. ②의 정의에서 강조 표시 한 문구 바로 뒤에 "확장 후"라는 단어를 적어 둡니다 . 그것은 중요하다. 그것은 당신이 퍼즐의 차이를 설명 할 수 있지만 그것은 다른 방법의 무리를 설명 않습니다 와 동일하지 않습니다.
—
zwol
$_
$_
!$