bash readline: 외부 명령에 대한 키 바인딩 실행

bash readline: 외부 명령에 대한 키 바인딩 실행

(배경: 저는 오랫동안 tcsh를 사용해 왔으며 점차적으로 bash로 전환하고 유용한 tcsh 관련 기능과 동등한 기능을 찾으려고 노력하고 있습니다.)

tcsh에서는 외부 명령을 실행하는 키 바인딩을 정의할 수 있습니다. 예를 들어, 다음과 같습니다.

bindkey -c ^Gu uptime

tcsh에 "Control-G u"를 입력하면 uptime명령이 실행됩니다. Enter를 입력할 필요가 없으며 명령이 내 기록에 나타나지 않으며 입력 줄 중간에서 수행할 수 있습니다(일부 명령에서는 후자가 특히 유용하다고 생각합니다).

bash에는 GNU readline 라이브러리를 통한 유사한 키 바인딩 메커니즘이 있으며 $HOME/.inputrc바인딩은 (또는 다른 곳에서) 지정됩니다. 그러나 문서를 읽은 후에는 info readline키 바인딩을 사용하여 외부 명령을 실행하는 방법을 찾을 수 없습니다.

내가 생각할 수 있는 가장 가까운 것은 내 .inputrc파일에 다음과 같은 것을 추가하는 것입니다.

"\C-gu": "uptime\n"

그러나 이는 명령을 실행하지 않고 마치 내가 무언가를 입력한 uptime다음 Enter를 누른 것처럼 동작합니다. 명령은 내 기록에 나타나며(괜찮습니다) 빈 줄에서만 작동합니다. 명령을 입력하면 명령을 실행하는 대신 "echo control-Gu"인쇄됩니다 .uptime

또 다른 사소한 단점은 바인딩이 Perl 디버거와 같이 GNU readline을 사용하는 다른 명령에 영향을 미친다는 것입니다.

bindkey -c키 시퀀스를 지정된 외부 명령 실행에 매핑하여 bash에서 tcsh의 효과를 시뮬레이션하는 방법이 있습니까 ?

중요한 경우 Ubuntu 12.04 베타 2에서 bash 4.2.24를 사용하고 있습니다.

답변1

모든 줄 편집이 bash;로 제어되는 것은 아닙니다. ~/.inputrc이들 중 대부분은 bind내장을 통해 구성됩니다. 이 경우 당신은 다음과 같은 것을 원합니다

bind -x '"\C-gu":uptime'

당신의 ~/.bashrc.

답변2

또 다른 대답은 새 줄에서 명령을 실행하는 솔루션을 제공합니다. 이는 어떤 경우에는 유용하지만 대부분의 경우 내 작업 흐름은 다음과 같습니다.

  • 명령을 인라인으로 실행한 결과를 내 파일에 삽입합니다.현재의명령줄(아래 예)
  • 실제로 백그라운드에서 명령을 실행하고 출력이 없으며 현재 명령줄은 변경되지 않습니다.

나는 @geekosaur가 보여준 변형보다 이 두 가지 원칙을 더 자주 사용합니다. 예는 다음과 같습니다.

bind '"\C-gd":"\C-u`date +%Y%m%d%H%M`\e\C-e\C-a\C-y\C-e"'

이 바인딩 CTRL- gd기존 명령을 종료하고(컷 버퍼에 저장) 삽입하고 some shell command(이 경우 date +%Y%m%d%H%M좋은 타임스탬프를 얻기 위해) 해당 명령을 실행한 다음 저장된 명령을 명령줄 앞부분에 다시 붙여 넣습니다.

내 시스템에서 일부 정보를 출력하는 명령이 많이 있고 다른 명령줄에서 자주 사용합니다 get_lan_ip, get_gw_ip, get_gw_pubip, get_ns_ip, get_root_block_dev, get_email_addr, get_phone_number. 기본적으로 프로그래밍 가능한 약어와 같습니다! 이 모든 \C-g작업은 단 한 번의 키 클릭만으로 완료됩니다.

나에게 매우 유용한 또 다른 사용 사례는 함수를 인라인으로 호출하는 것입니다.원하지 않는다출력을 생성하지만 mediaplayer_next, mediaplayer_pause, speakerphone_answer, ...터미널을 떠나지 않고 현재 창 내용을 일시적으로 무시하지 않고 무언가를 트리거하려는 경우와 같이 백그라운드 작업을 자동으로 트리거합니다.

답변3

허용된 답변에 추가하려면 실제로 를 사용할 필요가 없습니다 bind -x. 계속해서 답변에 추가할 수 있지만 시퀀스가 inputrc​​끝나면 \n바인딩이어야 합니다 accept-line. 예를 들어:

"\C-m": accept-line
"\C-gu": "uptime\C-m"

명령줄을 입력하게 되므로 uptime기록에 기록되며, 이는 사용 사례에 따라 장점이 될 수도 있고 단점이 될 수도 있습니다.

Mac 및 Windows에서는 캐리지 리턴 이지만 ^M순서는 중요하지 않습니다. 예를 들어 다음 사항도 적용됩니다.

"\xxacceptline": accept-line
"\C-gu": "uptime\xxacceptline"

답변4

허용된 답변으로 수행할 수 있는 몇 가지 트릭을 추가하려면 다음과 같은 것을 사용할 수도 있습니다.

bind -x '"\C-g": echo -en "\e[6t"'

현재 창을 맨 아래로 보내거나 xterm이 개발한 다른 이스케이프 코드를 보내 창을 중앙에 배치하고 창을 특정 픽셀 위치에 배치하는 등의 작업을 수행합니다.

또한 참조하세요 vttest(1)(놀면서 멋진 이스케이프 시퀀스를 많이 배울 수 있다는 것이 밝혀졌습니다 vttest).https://invisible-island.net/xterm/ctlseqs/ctlseqs.html

관련 정보