! *의 배쉬 기록 키보드 단축키 “two three” two three !*

Bash에는 마지막 명령의 일부를 반복하는 편리한 연산자가 있습니다.

  • !^ 이전 명령의 첫 번째 인수로 확장합니다. 예 :

    $ echo one "two three"
    one two three
    $ echo !^
    echo one
    one
    
  • !$ 이전 명령의 마지막 인수로 확장합니다. 예 :

    $ echo one "two three"
    one two three
    $ echo !$
    echo "two three"
    two three
    
  • !* 이전 명령의 모든 인수로 확장됩니다. 예 :

    $ echo one "two three"
    one two three
    $ echo !*
    echo one "two three"
    one two three
    

(지금까지 내가 이해, 이들에 대한 문법 설탕 있습니다 !!:^, !!:$그리고 !!:*각각 어디에 !!이벤트 지정자 이전 명령으로 확장하고 있다는 것입니다 ^, $그리고 *단어 지정자이다는 볼 배쉬 참조 설명서 또는 man bash.)

이것들은 종종 매우 편리합니다. 그러나 키보드 단축키로 훨씬 더 시원해집니다.

  • 당신이 공격 할 때 Alt+ .또는 Alt+를 _, 이전 명령의 마지막 인수는이 쓴 유사 것처럼, 현재의 명령에 삽입되어 !$그 시점에서.

  • 그 시점에서 작성한 것처럼 Alt+ Ctrl+ y를 눌러 이전 명령의 첫 번째 인수를 삽입 할 수도 있습니다 !^.

합니다 (참조 GNU의 Readline 라이브러리 또는 info readline.)

실제로 명령을 실행하기 전에 삽입하는 내용을 볼 수 있기 때문에 Bash의 기록 연산자보다 키보드 단축키를 선호합니다. 그러나 이전 명령의 모든 단어, 즉 !*작업 하는 단어를 모두 삽입 할 수있는 바로 가기가없는 것 같습니다 . 적어도 나는 그것을 찾을 수 없었다.

그런 지름길이 있습니까? 그렇지 않은 경우 readline 라이브러리를 구성하여 라이브러리를 추가 할 수 있습니까?



답변

다음 명령의 출력을 보면 :

bind -l

또는 더 나은 :

bind -l | grep arg

예를 들어, yank-last-arg마지막 인수와 같은 모든 인수에 대해 readline 함수가 존재하지 않는 것을 알 수 있습니다. 마지막 인수는 이전 명령 (이전 기록 항목의 마지막 단어)에 마지막 인수를 삽입 할 수 있습니다. 따라서 그러한 기능이 존재하지 않는다면 원하는 것을 달성하기위한 지름길이 없을 것입니다.

귀하의 요청에 접근 한 상자를 만들어 보도록하겠습니다 …

먼저 다음 명령의 출력을 살펴보십시오.

bind -p | grep yank-nth-arg

출력은 다음과 같습니다.

"\e\C-y": yank-nth-arg

다음과 같이 번역 할 수 있습니다. yank-nth-arg(이전 명령에 첫 번째 인수 삽입-인수 n을 사용하여 이전 명령의 n 번째 인수 삽입)은 Alt+ Ctrl+에 바인딩됩니다 y.

같은 방법으로 bind -p명령 출력의 모든 행을 해석 할 수 있습니다 .

이제 다음 시나리오에서주의하십시오.

  • 다음 바인딩을 설정 한 경우 :

    bind '"\ea": "\e2\e."'

    Alt+ AAlt+ 2Alt+ .에 매핑되고 이전 명령의 두 번째 인수를 삽입하도록 매핑됩니다. 따라서 Alt+ 를 누르면 이전 명령 A두 번째 인수가 현재 명령에 삽입됩니다.

  • 설정 한 경우 :

    bind '"\ea": "\e1\e. \e2\e."'

    Alt+ 를 누르면 이전 명령 A처음 두 인수가 현재 명령에 삽입됩니다. 이전 명령의 인수 수가 최대 2 인 경우 물론 이전 명령이 모두 현재 명령에 삽입됩니다.

  • 설정 한 경우 :

    bind '"\ea": "\e1\e. \e2\e. \e3\e."'

    Alt+ 를 누르면 이전 명령 A처음 세 인수가 현재 명령에 삽입됩니다. 이전 명령의 인수 수가 최대 3 인 경우 (이 경우처럼) 물론 이전 명령이 모두 현재 명령에 삽입됩니다.

  • 등등.

처음 10 개의 인수에는 다음을 사용할 수 있습니다.

bind '"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."'

그리고 나는 너무 많은 인수로 너무 자주 명령을 사용하지 않는 한 이것이 충분하다고 생각합니다.

지속적으로 유지하려면 ~/.inputrc파일에 다음 줄을 추가 하십시오.

"\ea": "\e1\e. \e2\e. \e3\e. \e4\e. \e5\e. \e6\e. \e7\e. \e8\e. \e9\e. \e1\e0\e."

이 예에서는 이전 명령의 모든 인수 (인수가 10보다 크지 않은 경우)를 삽입하기 위해 Alt+ A를 선택 했지만 이전 명령에서 \ea문자열 을 바꾸어 다른 조합을 선택할 수 있습니다 .

자원: