이전 명령의 인수를 사용하는 방법?


287

나는 Esc+ .가 당신에게 마지막 명령의 마지막 인수를 제공 한다는 것을 알고 있습니다.

그러나 나는 마지막 명령의 첫 번째 논쟁에 관심이 있습니다. 이를위한 키 바인딩이 있습니까?

같은 줄에 마지막 명령에서 n 번째 인수를 얻는 일반적인 방법이 있습니까? bash 스크립트 $0에서는 $1등을 사용할 수 있지만 명령 줄에서는 작동하지 않습니다.

또한 Esc+ 를 계속 눌러 마지막 인수로 할 수있는 것처럼 이전 명령의 0 번째 인수를 반복하면 .어떻습니까?

답변:


284

것처럼 M-.(메타 도트 또는 ESC 도트 Alt 키 도트)를 readline에 함수이며 yank-last-arg, M-C-y(메타 제어 Y 또는 ESC-CTRL-Y 또는 Ctrl + Alt + Y)을 readline에 함수이다 yank-nth-arg. 을 지정하지 않으면 n이전 명령의 첫 번째 인수를 취소합니다.

인수를 지정하려면 Esc 키와 숫자를 누르거나 Alt 키를 누른 상태에서 숫자를 누르십시오. 당신은 할 수 있습니다 Alt- -음수를 지정한 다음 Alt를 놓고 숫자를 누르십시오 (이것은 인수 목록의 끝에서 계산됩니다.

예:

다음 명령을 입력하십시오

$ echo a b c d e f g
a b c d e f g

이제 다음 프롬프트에서 echo(다음 공백으로)를 입력 한 다음

보도 Alt- Ctrl- y당신은 지금 볼 수 있습니다 :

$ echo a

Enter아직 누르지 않고 다음을 수행하십시오.

보도 Alt- 3 Alt- Ctrl-y

보도 Alt- - 2 Alt- Ctrl-y

이제 당신은 볼 것이다 :

$ echo ace

그건 그렇고, echo인수 0을 선택하여 줄에 넣을 수 있습니다 .

보도 Alt- 0 Alt- Ctrl-y

편집하다:

원본에 추가 한 질문에 대답하려면 :

당신은 누를 수 있습니다 Alt- 0다음 반복적으로 눌러 Alt- .단계를 이전 명령을 통해 (ARG 0)입니다. 마찬가지로 Alt- -다음 반복 Alt- .이전 다음 - 투 - 마지막으로 인수를 단계별로 허용합니다.

히스토리의 특정 라인에 적절한 인수가 없으면 벨이 울립니다.

자주 사용하는 특정 조합이 있으면 한 번의 키 입력으로 매크로를 정의 할 수 있습니다. 이 예는 눌러 이전 명령의 두 번째 인수를 기억한다 Alt- Shift- Y. 이 키 대신 원하는 키를 선택할 수 있습니다. 반복해서 누르면 이전 단계를 진행할 수 있습니다.

그것을 시도하려면 Bash 프롬프트에서 매크로를 입력하십시오.

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

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

"\eY": "\e2\e."

불행히도 이것은 arg 0 또는 음수 인수 번호에는 작동하지 않는 것 같습니다.


14
bash / readline의 키보드 단축키를 bind -lp찾을 때 현재 바인딩을 실행 하고 보는 것이 좋습니다.
채드 스키터

1
@ChadSkeeters : 그리고 -s(Bash 4의 새로운 기능)은을 사용하여 생성 된 매크로를 나열합니다 -x.
추후 공지가있을 때까지 일시 중지되었습니다.

당신이 숫자 인수를 사용할 수 있습니다 M-.:뿐만 아니라 Alt-3 Alt-Ctrl-y예를 들고 같음을 위해 Alt하고 입력 3.. 3.해제하지 않고 여러 번 입력 Alt하면 이전 명령 줄의 세 번째 인수를 거치게됩니다.
디저트

@dessert : 두 번째 단락에서 많이 말한 다음 예제를 보여줍니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@ChadSkeeters, 수백 개의 항목 이있을 것이라는 경고에 감사드립니다 ! 롤
jdk1.0

309

!$ 이전 명령 줄 인수의 마지막 요소를 가져옵니다.


115
!:3당신에게 세 번째를 얻을 수
매트 닷지

108
! * 당신에게 모든 em을 가져
wonton

75
!!마지막 명령 전체를 얻습니다. 사용을 잊어 버린 경우에 유용합니다 sudo.
Un3qual

43
!:1-2마지막 3 가지 논거를 제외하고 모두를 얻는다
Tyler Brock

5
경고 한마디-와 같은 결합 인수를 사용 echo foo{,bar} baz하면 명령이 인쇄 된 것으로 기록되고 나중에 확장됩니다. 위와 같이 echo !:1after를 사용 하면 echo foo{,bar}다음으로 확장되어 확장됩니다.echo foo foobar
Sean

201

첫 번째 인수를 사용하려면 !^또는!:1

예:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

귀하의 질문은 다른 인수를 사용하는 것에 관한 것이므로 다음과 같은 유용한 인수가 있습니다.

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

처음 네 가지 형태가 더 자주 사용됩니다. 이 형식 !:2-은 마지막 인수를 포함하지 않으므로 다소 직관적이지 않습니다.


두 번째로 마지막 아이템을 얻는 방법이 있습니까? 즉 얻을 file3에서 mv file1 file2 file3 target/?
Charlie Harding

3
나는이 답변을 많이 좋아했으며 완전성을 위해 이전 명령 이전에 액세스 할 수있는 '! -2'구문에 대한 줄을 추가하는 것이 좋습니다.
bbv

1
@bbv 또한 더 완벽하게하기 위해 '! 2'명령을 사용하면 기록의 두 번째 항목에 액세스 할 수 있습니다 (이력 설정에 따라 여전히 사용 가능한 경우). 각 프롬프트에 내역 번호를 표시 할 때 유용합니다.
816-8055

53

@larsmans의 답변이 너무 좋아서 더 많은 것을 배워야했습니다. 이 답변을 추가하면 다른 사람들이 매뉴얼 페이지 섹션을 찾고 Google에서 무엇을해야하는지 알 수 있습니다.

$ man  -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators

Word designators are used to select desired words from the event.
A : separates the event specification from the word designator.
It may be omitted if the word designator begins with a ^, $, *, -,
or %.  Words are numbered from the beginning of the line, with the
first word being denoted by 0 (zero).  Words are inserted into the
current line separated by single spaces.

   0 (zero)
          The zeroth word.  For the shell, this is the command word.
   n      The nth word.
   ^      The first argument.  That is, word 1.
   $      The last argument.
   %      The word matched by the most recent ‘?string?’ search.
   x-y    A range of words; ‘-y abbreviates 0-y’.
   *      All of the words but the zeroth.
          This is a synonym for 1-$’.  
          It is not an error to use * if there is just one word in
          the event; the empty string is returned in that case.
   x*     Abbreviates x-$.
   x-     Abbreviates x-$ like x*, but omits the last word.

   If a word designator is supplied without an event
   specification, the previous command is used as the event.

18

! ^는 첫 번째 인수에 대한 명령 일 수 있습니다. n 번째를 얻는 방법이 있는지 확실하지 않습니다.


7
위에서 제안한대로! : n
Sergiu

마지막 n 번째 항목을 얻는 방법이 !:n있습니까?하지만 시작이 아닌 끝에서 계산합니까?
Charlie Harding

14

당신은 또한 당신의 역사에있는 어떤 명령으로부터도 논쟁을 얻을 수 있습니다!


$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
  601  echo build/libs/jenkins-utils-all-0.1.jar
  602  history | tail -10
  603  echo a b c d e f g
  604  echo build/libs/jenkins-utils-all-0.1.jar
  605  history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar


4

우분투에서 테스트 18.04


이전 인수를 삽입하려면

  • Alt+ .: 마지막 명령에서 마지막 인수를 삽입합니다.
  • Alt+ #+ .: 마지막 명령에서 #n 번째 마지막 인수를 삽입합니다.
  • Alt+ -, #, Alt+ ., zsh을 : Alt + -+ #+ .: 마지막 명령의 첫 번째 인수 #nth 삽입.

Linux에서는 명령을 반복하여 기록으로 돌아갈 수 있습니다

예:

마지막 명령은 :

mv foo bar
  • Alt+ 0+ .: 마지막 명령의 첫 번째 인수 삽입 =mv
  • Alt+ 2+ .: 마지막 명령의 마지막 두 번째 인수 삽입 =foo
  • up, Ctrl+ w: 마지막 단어가없는 마지막 명령 =mv foo

일반적인 지름길

  • Ctrl+ w: 커서에서 마지막 단어를 제거합니다
  • Alt+ d: 커서에서 다음 단어를 제거합니다
  • Ctrl+ k: 커서 후 모든 것을 잘라냅니다
  • Ctrl+ u, zsh : Alt + w: 커서 전에 모든 것을 잘라냅니다
  • zsh : Ctrl + u: 전체 명령을 잘라냅니다 (bash에서는 Ctrl+ u, Ctrl+를 결합 할 수 있습니다 k)
  • Ctrl+ y: 이전에 Ctrl+ uCtrl+로 잘라낸 문자 붙여 넣기k
  • Ctrl+ _: 마지막 편집 실행 취소 ( Ctrl+를 초과 할 때 매우 유용 w)
  • Ctrl+ left: 마지막 단어로 이동
  • Ctrl+ right: 다음 단어로 이동
  • home또는 Ctrl+ a: 줄의 시작으로 이동
  • end또는 Ctrl+ e: 줄의 끝으로 이동

이전 명령에서 인수를 반복하려면

zsh에서만 작동

이것을 실행하거나 ~/.zshrc

autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word

이제 Alt+ .를 사용 하여 원하는대로 되돌아 간 다음 Alt+ :를 사용하여 인수를 반복하십시오.

마지막 명령을 가정하면

echo 1 2 3 4 5
  • Alt+ .:5
  • Alt+ .+ ::4
  • Alt+ .+ :+ ::3
  • Alt+ .+ :+ :+ ::2
  • Alt+ .+ :+ :+ :+ ::1
  • Alt+ .+ :+ :+ :+ :+ ::echo

출처 : https://stackoverflow.com/a/34861762/3163120

사용 가능한 모든 바로 가기를 보려면

  • 세게 때리다: bind -lp
  • zsh : bindkey -L

나는이 요점에서 이것을 최신 상태로 유지하고있다 https://gist.github.com/madacol/da38e42d7e45c2949a9f425cc20543e9


1
Alt .Mac의 Zsh에서 🤔을 입력 중입니다.
André Pena

1
Esc. 마지막 것만 작동하더라도 작동합니다. 다시 입력하기 위해 계속 타이핑 할 수는 없습니다. 아마도 대답을 업데이트 할 가치가 있습니다. 대단히 감사합니다.
André Pena

zsh 에서 실행 bindkey -L하여 모든 바로 가기가 바인드되어 있는지 확인할 수 있습니다 . 어쩌면 문제를 찾아내는 데 도움이되거나 다른 유용한 명령을 찾을 수도 있습니다. 필자의 경우 예를 들어 바인딩 은로 정의됩니다 . (화면을 지우려면)-> . -> ( 마지막 단어를 제거하는 것과 동일 )Alt .bindkey "^[." insert-last-wordCtrl Lbindkey "^L" clear-screenAlt+Ctrl hbindkey "^[^H" backward-kill-wordCtrl w
Madacol

@Madacol 나는 또한 바인드 키에서 언급 된 복사 초기 단어를 볼 수 있습니다 bindkey "^[^_" copy-prev-word
kikeenrique

3

기본적으로 이전 (명령) 인수 를 yanking하는 데 사용됩니다 .

예를 들어, 다음 명령이 발행 된 경우 :

echo Hello, world how are you today?

그리고, Hello,제 인수되고 여섯째 마지막 하나이고; 다음을 입력하여 참조 할 수 있음을 의미합니다.today?

Alt+6 뒤에 Ctrl-Alt-6


Ctrl전통적으로 모자 문자로 표시되는 ^키 이름 앞에 추가하고, Alt같은 M-M의 ETA의 접두사.

따라서 위의 지름길 ^My을 잡아 당기도록 재정의 할 수 있습니다 .


또한 명령 행에 모자 대체 단축키가 있습니다.

echo Hello, world!

^Hello^Bye

Bye, world!

이전 명령의 첫 번째 일치 문자열 을 대체하려면 다음을 의미합니다.

Hello, world! Hello, people!

^Hello^Bye

결과 :

Bye, world! Hello, people!

두 번째 일치 ( hello)는 그대로 유지합니다.

참고 : hats 사이에 공간을 두지 마십시오 . 그렇지 않으면 작업이 작동하지 않습니다.


위의 바로 가기는 다음과 같습니다.

!:s/Hello/Bye

이전 명령의 제 실측치 (일치) 문자열을 일정 수준 (*) 교체는 함께 첫 번째 부분 접두어 동안 g스위치에 적용되는 전체 광고 g lobally :

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

같은 보통 기타 관련 명령에서 수행되고 sed, vi그리고의 regex(정규 표현식) - (검색 할 수있는의 standart 방법 일치하는 문자열 ).

아니, 당신은 할 수 없습니다 !:sg/Hello/Bye또는 !:s/Hello/Bye/g여기, 구문입니다 !


  • ! 이벤트 용입니다. 이벤트는 명령 내역에서 수행 된 명령 출력 또는 작업으로 이해 될 수 있습니다.

그것은 내가 직접 사용하고 매뉴얼 페이지, 블로그 및 포럼을 포함한 다양한 출처에서 읽은 내용을 직접 시도하여 이해 한 것입니다.

서버 ( 서버 OS )를 포함한 많은 배포판에서 기본 쉘이 무엇인지 bash, Bourne-Again 쉘 (발명 체 sh자체, 발명가 성 뒤에 Bourne 쉘이라고 함)의 신비한 방법에 약간의 빛을 비추기 를 바랍니다 .


3

! ^는 첫 번째 매개 변수를 가져오고! $는 마지막 매개 변수 를 가져옵니다 ! : n 은 n 번째 요소를 가져옵니다.


0

허용 된 답변의 끝에서 설명 된 방법은 또한 나를 위해 0 번째 인수와 함께 작동합니다. 내 라인 에이 줄이 있습니다 ~/.inputrc.

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e.\e2\e\C-y이전 명령의 두 번째 인수를 여러 번 삽입하는 대신 반복해서 누르면 이전 명령을 순환한다는 장점이 있습니다.

이전의 전체 명령을 삽입하려면을 입력하십시오 !!\e^. \e^입니다 history-expand-line.


0

Mac을 사용하는 경우 ctrl + letter를 사용하여 확장 된 문자를 얻는 경향이 있습니다. 터미널 (iTerm2) 설정에서 스페이스 바 옵션 키를 메타로 정의했습니다. 즉, 키를 사용하여 단어별로 탐색하고 이전 명령에서 매개 변수를 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.