내가 이해하는 $_
기존 대리인과 유사하게 두 번째 또는 세 번째 -last 명령을 참조하여 etc 등에 !-1:$
대한 별칭을 만들고 싶습니다 . 추가해보았습니다$__
$___
alias "$__"='!-2:$'
내 .zshrc.local
. 가능하다면 밑줄 수에 따라 마지막 n번째 명령의 첫 번째 인수를 반환하는 zsh 함수를 작성하고 싶습니다.
arch linux kernel 5.1.4-arch
zsh 5.7.1 (x86_64-pc-linux-gnu)
답변1
이 기능은 이미 존재합니다.
이전 명령의 마지막 단어에 액세스하는 데 복잡한 것은 필요하지 않습니다. ESC-.
(예: Alt+ .) 또는 ESC-_
(예: Alt+ ) 를 누르기만 하면 됩니다 _. 그러면 편집기 명령이 호출됩니다.insert-last-word
, 이전 명령줄의 마지막 단어를 삽입합니다. 명령줄에서 이전 마지막 단어를 가져오려면 키를 다시 누르십시오. ESC-.
너무 많이 누르셨다면 C-_
(Undo)를 이용하여 이전 단어로 돌아가세요.
vi 모드에서 이 명령은 기본적으로 키에 바인딩되지 않지만 bindkey
.
숫자 인수를 전달하여 다른 단어를 얻을 수 있습니다. 양수는 오른쪽에서 시작하고(1은 마지막 단어), 0 또는 음수는 왼쪽에서 시작합니다(0은 첫 번째 단어, 일반적으로 명령 이름, 1은 명령 이름) ) 첫 번째 인수 다음의 단어 등). 예를 들어, ESC . ESC - ESC 1 ESC .
두 번째 명령의 첫 번째 인수를 삽입하십시오.
이 명령 주위에 자신만의 위젯을 정의하여 이 명령을 다양하게 변형할 수 있습니다 zle insert-last-word
. Zsh가 함께 제공됩니다copy-earlier-word
그리고smart-insert-last-word
있는 그대로 사용하거나 코드 예제로 사용하는 데 유용할 수 있습니다.
정말로 이전 명령의 마지막 단어로 확장하고 싶다면 $__
아래에 몇 가지 해결책을 제시하겠지만 먼저 무슨 일이 일어나고 있는지 설명해야 합니다.
시도가 작동하지 않는 이유
첫째, 당신은 당신이 정의하고 있다고 생각하는 것을 정의하지 않습니다. alias "$__"=…
별칭 정의가 실행될 때 변수의 현재 값 이 이름인 별칭을 정의합니다 . __
비어 있을 수 있으므로 alias ='!-2:$'
검색 '!-2:$'
경로(=
확장파일 이름 확장자의 일부). 라는 별칭을 정의하려면 이를 with 또는 같은 alias 명령에 $__
전달해야 합니다 .$__
alias '$__'=…
alias \$__=…
둘째, 별칭은 명령 위치, 즉 명령의 첫 번째 단어(선행 변수 할당 및 리디렉션 후)에서만 확장됩니다. 이 별칭을 유용하게 사용하려면 다음과 같아야 합니다.전역 별칭:alias -g '$__'=…
셋째, 별칭 확장은 기록 확장 후에 발생하므로 이 별칭은 유용한 작업을 수행하지 않습니다.
darkstar
darkstar% alias -g '$__'='!-2:$'
darkstar% echo $__
!-2:$
$_
"대표자"가 아닙니다 !-1:$
. 일반적인 상황에서 동일한 정보에 액세스하는 두 가지 방법이 있습니다 $_
. "is an alias" 또는 반대로 "is an alias" !-1:$
라고 말할 수 있지만 이는 쉘 별칭의 기술적인 의미가 아닌 일반적인 영어 의미에서 "alias"를 사용하는 것이며 둘 다 항상 동일하지 않기 때문에 부정확합니다. 값. 는$_
!-1:$
!-1:$
$_
!-1:$
역사적 확장( !
) 구성은 다음으로 확장됩니다.마지막 말( :$
) 의이전 명령줄( -1
). $_
는parameter expansion
매개변수 사용_
쉘은 이를 이전 명령의 마지막 인수로 설정합니다. 실행하는 명령줄이 정확히 간단한 명령이 아닌 경우 영향을 미칠 수 있습니다. 예를 들면 다음과 같습니다.
darkstar% for x in 1 2 3; do echo $x; done
1
2
3
darkstar% echo $_ is not !-1:$
echo $_ is not done
3 is not done
darkstar% echo $_ and !-1:$ are different; echo $_ and !-1:$ are different
echo $_ and done are different; echo $_ and done are different
done and done are different
different and done are different
$__
각 명령 정의
다음을 정의할 수 있습니다.트랩 기능라고TRAPDEBUG
각 명령이 실행되기 전에 실행됩니다. 현재 값을 기억한 다음 $_
(트랩 내부의 첫 번째 명령이 덮어쓰기 때문에 이 작업을 먼저 수행해야 함 _
) 다중 밑줄 변수를 "이동"합니다.
darkstar% TRAPDEBUG () { _0=$_; ___=$__; __=$_1; _1=$_0; }
darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_,$__,$___
three,two,one
$_1
$_
디버그 트랩은 설정을 유발한 것과 정확히 동일한 상황에서 실행되지 않기 때문에 항상 동일하지는 않지만 _
거의 유사합니다.
$__
각 명령줄 정의
당신은 등록할 수 있습니다후크 기능명령줄을 입력하기 전이나 후에 실행합니다. 이 경우,precmd
또는preexec
. 명령을 실행하기 전과 후에 각각 실행됩니다.
preexec_set_underscore_variables () {
___=$__
__=$_1
_1=$historywords[1]
}
preexec_functions+=(preexec_set_underscore_variables)
나는 사용한다historywords
명령줄에서 마지막 단어를 가져옵니다. 이미 꽉 차있어서 _1
보관 했어요 . _
이 함수는 마지막 단어 기록 변수를 1씩 "이동"합니다.
darkstar% echo one
one
darkstar% echo two
two
darkstar% echo three
three
darkstar% echo $_ $__ $___
three two one