Bash 명령에서 첫 단어를 빠르게 변경하는 방법은 무엇입니까?


44

Bash를 사용하여 워크 플로우를 조금 개선하고 싶습니다. 다른 실행 파일에 대해 동일한 명령을 자주 실행하고 싶다는 것을 알고 있습니다.

몇 가지 예 :

힘내 (두 번째 단어를 빠르게 바꾸고 싶은 곳) :

git diff     foo/bar.c
git checkout foo/bar.c

Cat / rm (첫 번째 단어 만 변경해야 함) :

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

나는 Ctrl+를 a누른 다음 Del첫 단어를 제거 할 수 있다는 것을 알고 있지만 더 빠른 방법이 있는지 궁금합니다.



솔직히 Ctrl + a를 사용하고 삭제하는 것이 가장 안전하다고 생각합니다. 확실히 느리지 않습니다.
agweber

답변:


56

!$ 이전 명령의 마지막 단어로 확장됩니다.

그래서 당신은 할 수 있습니다 :

cat foo/is/a/very/long/path/to/bar.c

rm !$

또는:

git diff foo/bar.c

git checkout !$

귀하의 예는 마지막 단어 만 반복했기 때문에 !$잘 작동했습니다. 실제로 반복하려는 많은 인수가 있고 첫 단어를 변경하고 싶을 !*경우을 사용할 수 있습니다 .이 명령은 0을 제외하고 이전 명령의 모든 단어로 확장됩니다.

bash매뉴얼 페이지 의 "히스토리 확장"섹션을 참조하십시오. 거기에는 많은 유연성이 있습니다.


16
옳고 적절합니다. 나는 넣어에만 싶습니다 경고 :와 !$당신이없는 실행중인 라인의 더 완전한 시각 제어 . 때때로 유해 할 수 있습니다. 특히 잘못 인쇄 된 경우. 그것은에서 소요 history확장하는 것. 따라서 처음에 공백이있는 마지막 명령을 쓰면이 명령이 기록에서 끝나지 않을 수 있습니다. !$쉘을 사용하여 새 명령을 실행 하면 마지막으로 입력 한 명령 줄에서 매개 변수를 사용하지 않고 마지막 기록에서만 매개 변수를 가져옵니다. 여기에 더 많은 단어가 있습니다.
Hastur

1
@Hastur 당신은 사고를 예방하기 위해 탭이나 입력시 기록을 확장하도록 쉘을 설정할 수 있습니다.
slhck

2
@Hastur 그렇기 때문에 zsh에서 소개를 두 번 눌러야하는 이유
Braiam

@Hastur - 나는 일이 아니면 내가 뒤늦게 내가 먼저 긴 난 그냥에서 입력 한 뭔가를 실행하기 전에 다른 뭔가를해야 실현하기 위해 무슨 일이 일어나고 있는지에 대한 의문이있을 때, 나는 줄의 시작 부분으로 이동하여 추가 #또는 echo 내가 수를 그것을보고 그것은 역사로 간다. 그래서 다시 접을 수 없게하지 않고 다시 실행할 수 있습니다.
Joe

28

Ctrl+ a는 줄의 시작 부분으로 이동 한 다음 Alt+ d는 첫 단어를 삭제합니다.


9
삭제 단어 바로 가기는 실제로 Meta + d이며 메타는 일반적으로 Linux 시스템에서 Alt에 맵핑됩니다. 그렇지 않은 플랫폼에서 메타 수정자를 얻는 대안은 Escape를 접두사로 사용하는 것입니다. en.wikipedia.org/wiki/Meta_key
Gustavo Giráldez

2
@ GustavoGiráldez 당신이 깊이 가고 싶다면 (활성화 되거나 기본적으로) 활성화 된 Meta+D경우에만 유효합니다 . 열등한 편집기 모드 또는 작동하지 않는 경우 에는 작동하지 않습니다. emacsset -o emacsemacs
TC1

많은 터미널에서 (Bash가 아닌 터미널 일이기 때문에) 홈 키도 줄의 시작 부분으로 이동합니다. 많은 랩톱이 Fn + Left를 홈 키에 매핑합니다. 마찬가지로 끝 키는 일반적으로 줄의 끝으로 이동합니다. 이 핫키를 지원하지 않는 터미널 에뮬레이터를 아직 사용하지 않았습니다.
Kat

1
반면에 @ 마이크, C-a그리고 M-d당신의 손 위치를 입력 이미있는 경우 입력하는 것이 훨씬 빠릅니다.
jjlin

@Mike 이것은 bash 일입니다. cat홈 ( ^[[H여기)을 누르고 Ctrl + a ( ^A)를 누를 때 얻은 것을 입력 하고 비교 하십시오 .
Jonas Schäfer

17

실제로 더 빠를 지 확실하지 않지만 이 기사, 특히 포인트 # 3을 참조하십시오 .

  1. ^ str1 ^ str2 ^를 사용하여 이전 명령의 문자열을 바꾸십시오.

다음 예제에서는 먼저 ls 명령을 실행하여 파일을 확인했습니다. 나중에 우리는 파일의 내용을보고 싶다는 것을 깨달았습니다. 전체 파일 이름을 다시 입력하는 대신 아래 표시된대로 이전 명령의 "ls"를 "cat"으로 바꿀 수 있습니다.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+.

이전 명령 중 하나의 마지막 부분 만 반복해야하는 경우 Alt+ .를 사용 하여 기록의 마지막 행에서 가져온 마지막 인수를 붙여 넣을 수 있습니다 .

한 번 이상 누르면 이전 줄의 마지막 인수로 붙여 넣은 것을 대체합니다 ...

예를 들어 마지막 두 명령이 다음과 같은 경우

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

셸에서 쓰고 +를 rm누르면 다음과 같이 나타납니다.Alt.

rm foo/is/a/very/long/path/to/SomeWhereElse.c

다시 누르면 Alt+ .대신 나타납니다

rm foo/is/a/very/long/path/to/bar.c

등등...


이유가 확실하지 않지만 Mac 콘솔에서 작동하지 않습니다.
lulalala

여기 에 작동하는 것으로 알려진 키보드 단축키 가 있습니다 bash. BTW bash를 쉘로 사용하고 있습니까?
Hastur

1
나는 이것이 Mac 일 것 같아. 내가 입력하면
lulalalala


12

@jjlin 답변 외에도 다음 팁에 관심이있을 수 있습니다.

  • Ctrl+ w왼쪽 단어를 삭제합니다
  • Ctrl+ k커서에서 명령 줄 끝까지 삭제
  • Ctrl+ u커서에서 명령 행 시작까지 삭제
  • Alt+ b커서를 한 단어 뒤로 이동
  • Alt+ f커서를 한 단어 앞으로 이동
  • $_ 이전 명령 행의 마지막 인수를 포함합니다

이에 대한 자세한 내용은 bash맨 페이지 의 "Readline Command Names"섹션을 참조하십시오 .

예 :

cat foo/is/a/very/long/path/to/bar.c
rm $_

이것들은 좋은 팁이지만 질문에 대답하지 않습니다.
slhck

@slhck IMHO 질문 제목이 주어진 예제와 일치하지 않기 때문에 그럴 수 있습니다. 예제에 초점을 맞추면 제목은 "bash 명령에서 단어를 빠르게 변경하는 방법" 이어야합니다. . 이것은 또한 내 대답이 "@jjlin에 추가하여"하나 인 이유이기도합니다. 그러나 질문을 명확히해야한다고 생각합니다.
maiki

OP는 항상 첫 번째 예와 두 번째 예에서 n와 같이 명령 의 첫 번째 단어 를 제거 (교환)하려고합니다 . jjlin의 답변은 첫 번째 단어를 삭제하는 방법을 보여줍니다 (바로 가기를 다시 적용하여 단어 까지 삭제 ). 귀하의 답변에는 몇 가지 Bash 단축키 (실제로는 유용한)가 나열되어 있지만 첫 번째 단어 를 삭제하는 효율적인 방법은 없습니다 . n = 1n = 2nn
slhck

흠, 다시 읽으면, $_인수가 하나 뿐인 경우 (즉, 인수 의 총 개수가 n = m - 1어디에 있는지) 매개 변수가 작동합니다 m. 그래도 나머지 단축키는 질문과 관련이 없습니다.
slhck

@slhck 논쟁을 위해 첫 번째 예제를 "두 번째 단어를 대체하십시오"라고 읽었습니다 :-)
maiki

8

vi에 능숙하다면, 명령을 사용하여 bash (대부분의 쉘?)에서 vi 바인딩을 활성화 할 수 있습니다 set -o vi. 그런 다음 일반 vi 키를 사용하여 명령을 편집 할 수 있습니다. 첫 번째 예에서는 ^wcw"diff"를 삭제 한 다음 체크 아웃으로 변경할 수 있습니다.

커맨드 라인을 편집하는 것만으로 vi 키 바인딩을 배우는 것은 가치가 없지만, 이미 알고 있다면 깔끔한 생산성 향상 도구입니다.


나는 kornshell에서 배웠 set -o vi습니다. 나는 심지어 내 배쉬 프롬프트에서도 이것을한다.
bgStack15

bindkey -vzsh. Esc 0 c w
user530873

6

이 고양이를 벗기는 방법에는 여러 가지가 있습니다!

특정 문자열을 교체하려면 ^old^new^extra, 이전 명령을 대체 할 oldnew, 그리고 추가 extra. 원하는만큼 빨리 멈출 수 있습니다. 예를 들어 빈 문자열로 ^old대체 old하고 빈 문자열을 추가합니다 (필수적으로 삭제 old하고 더 이상 수행하지 않음).

1. ^diff^checkout
2. ^cat^rm

이것의 특히 유용한 변형 :

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

특정 단어를 바꾸려면 명령을 통해 !m:n-p단어를 참조하는 데 사용할 수 있습니다 (음수를 사용하여 현재 명령에서 다시 계산). 단일 단어 를 나타내 도록 부품을 생략하고 전체 명령을 나타 내기 위해 부품을 생략 할 수 있습니다 . 특수 형태 에 대한 , 이전 명령의 마지막 단어, 및 인수에 대한 (모든하지만 단어 이전 명령의)는 꽤 편리합니다.npm-p:m-p!!!-1!$!*0

1. !!:0 checkout !!:2-
2. rm !*

나는 종종이 두 가지를 모두 사용한다. zsh 키를 누르면 암호 항목을 확장하여 올바른 정보를 얻을 수 있으므로 zsh가 특히 좋습니다.

라인 편집으로이를 수행하는 방법은 여러 가지가 있습니다. 쉘의 키 바인딩을 읽으십시오.


-2

대부분의 터미널 프로그램은 다음을 지원합니다 ...

  • <Up-Arrow>히스토리에서 이전 명령 행 중 하나를 다시 표시하려면 필요에 따라를 누르십시오 .
    • <Down-Arrow>필요에 따라을 눌러 내역 목록을 진행하십시오.
  • 보도는 <Left-Arrow>두 번째 단어의 끝으로 커서를 이동하기 위해 필요에 따라.
  • <Backspace>필요에 따라을 눌러 두 번째 단어를 지 웁니다.
  • 대체 두 번째 단어를 입력하십시오.
    • 필요에 따라 <Right-Arrow>/ <Left-Arrow>을 눌러 변경 내용을 더 바꿉니다.
  • <RETURN>명령을 실행하기 위해 누르십시오

원하는 명령 줄이 최근이 아닌 경우 <Ctrl-r>질문에 설명 된대로 reverse-i-search를 수행하십시오 ...
bash에서 명령의 일부를 입력 한 후 ctrl-r을 사용하는 방법이 있습니까?
그런 다음 필요에 따라 화살표 키를 통해 편집하십시오.


-3

내가하는 일 (Ubuntu / bash) :

1) Arrow up이전 명령으로 돌아 가기
2) Home시작으로 돌아가려면 키
3) 필요에 따라 명령을 수정하십시오.

바보 방지 및 여러 줄 명령에 특히 유용합니다.

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