! *의 배쉬 기록 키보드 단축키


8

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 라이브러리를 구성하여 라이브러리를 추가 할 수 있습니까?


AFAIK, 키보드 단축키는 터미널 에뮬레이터에 의해 처리됩니다. 그래서 당신이 그놈 터미널을 사용하고 있다고 가정합니까?
Seth

1
에서 zsh입력 echo !*한 다음 Tab 키를 누르면 원하는 효과가 나타납니다. 일반적으로 readline 상태에서 TAB은 모든 확장 가능 파일을 확장합니다. 매우 편리합니다. 아마도 bash는 동일한 효과에 대한 구성을 가지고 있습니까? @ Seth, 이것이 터미널 에뮬레이터가 아닌 bash의 readline이라고 생각합니다.
Rmano

2
@Seth 아니오, Q의 단축키는 bash에 의해 처리됩니다. 당신을 위해 serch 수있는 '역사를 조작하기위한 명령' 에서 man bash(라인 3030 어딘가에)
라두 Rădeanu

@ RaduRădeanu 아 흥미로운! 나는 몰랐다. 나쁜 가정에 대한 나의 나쁜.
세스

1
\e.\e_readline에 기능에 매핑된다 yank-last-arg\e\C-y매핑된다 yank-nth-arg. 슬프게도 여러 개의 이전 인수를 한 번에 추가하는 (단일) 명령이없는 것 같습니다.
Adaephon

답변:


5

다음 명령의 출력을 보면 :

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문자열 을 바꾸어 다른 조합을 선택할 수 있습니다 .

자원:


글쎄, 그것은 다소 해킹 적이며 제한된 수의 인수에 대해서만 작동하지만 우리가 가장 쉽게 얻을 수있는 가장 가까운 것 같습니다. 언뜻보기에는 파일에서 보이는 것처럼 funmap.c함수 yank-nth-arg는 C 함수에 매핑되며 ,이 함수 는 rl_yank_nth_arg에서 정의됩니다 kill.c. 유사하게 yank-last-arg. 물론 그러한 기능으로 readline을 확장 할 수는 있지만 그렇게하고 싶지는 않습니다. 내 readline에 의해 관리 될 것을 선호 apt하고,이 기능하지 중요한)
말테 Skoruppa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.