Return다른 입력 없이 셸에서 별칭 명령을 실행하고 싶습니다 . Bash나 Zsh에서 이것이 가능합니까?
즉, 빈 명령줄을 입력하면 특정 명령을 실행하고 싶습니다. 다른 명령줄은 영향을 받지 않아야 합니다.
$ ls <Return>
→ run ls
$ <Return>
→ run my aliased command
답변1
무슨 뜻인지는 모르겠지만, 다음과 같습니다 zsh
.
accept-line() {: "${BUFFER:="my-aliased-command"}"; zle ".$WIDGET"}
zle -N accept-line
Enter빈 버퍼를 누르면 실행됩니다my-aliased-command
이는 accept-line
위젯을 함수로 재정의하는 것입니다. zle
(zsh Line Editor) 위젯 에는 $BUFFER
지금까지의 명령줄 내용이 포함되어 있습니다. 그래서 여기서는 my-aliased-command
내장 위젯 accept-line
( )을 실행하기 전에 이를 비워두도록 설정했습니다 .accept-line
.
my-aliased-command
이는 명령 기록에 추가된다는 의미입니다 .
이 작업을 원하지 않는 경우 다른 접근 방식은 다음과 같습니다.
accept-line() {
if [[ -z $BUFFER ]]; then
zle -I
my-aliased-command
else
zle ".$WIDGET"
fi
}
zle -N accept-line
비어 있으면 $BUFFER
프롬프트를 무효화하고(명령에 출력이 없으면 이 작업을 수행할 필요가 없음) 그렇지 않으면 내장 함수를 실행합니다 my-aliased-command
.accept-line
답변2
이는 bash 4에서 가능하지만 다음보다 덜 효율적입니다.zsh에서. 명령줄이 비어 있는지 테스트하려면 함수를 정의해야 합니다 READLINE_LINE
. 이 기능을 사용하면 명령이 자동으로 실행되도록 예약하는 것보다 빈 줄에 원하는 명령을 삽입하는 것이 더 쉽습니다. 이 함수를 실행한 후 Return기본 매핑 에 바인딩된 키 시퀀스가 삽입됩니다 . Ctrl+는 J일반적으로 동의어입니다. 테스트되지 않은 코드.
insert_default_command_if_empty () {
if [[ -z $READLINE_LINE ]]; then READLINE_LINE='ls -l'; fi
}
bind '"\e[z1~": insert_default_command_if_empty'
bind '"\C-m": "\e[z1~\C-j"'