별칭에 대한 다른 입력 없이 매핑이 반환됩니다.

별칭에 대한 다른 입력 없이 매핑이 반환됩니다.

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"'

관련 정보