$ _ vs! $. 이전 명령 및 출력 리디렉션의 마지막 인수


28

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

!!:$

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


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

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

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

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

차이점은 무엇입니까?


4
! $는 특수 변수가 아닌 히스토리 확장이므로 bash 코드가 다르게 처리한다고 가정합니다.
Jeff Schaller

2
나는이 질문에 확실한 대답을 가지고 있지만하지 않습니다 : ① Bourne 쉘 언어 중 하나, 아마도 여전히 오늘날 널리 사용되는, 적어도 내부적으로 일관성이 프로그래밍 언어. 일반적인 원칙을 추론하려고하면 아무데도 갈 수 없습니다. 모든 특별 규칙을 암기해야합니다. 죄송합니다. ②의 정의에서 강조 표시 한 문구 바로 뒤에 "확장 후"라는 단어를 적어 둡니다 . 그것은 중요하다. 그것은 당신이 퍼즐의 차이를 설명 할 수 있지만 그것은 다른 방법의 무리를 설명 않습니다 와 동일하지 않습니다. $_$_!$
zwol

답변:


32

!$역사 확장의 단어 지정자이며, 그것은에서 이전 명령의 마지막 단어로 확장 역사 . 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

1
하나 개의 효과 !$대 확장 $_파라미터 즉 echo $_역사 항상 방송 echo $_하지만, echo !$이 확장 된 것을 표시하는 값. 예 echo one two를 들어 echo !$, 다음을 누르면가 표시 echo two됩니다.
Jacktose
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.