나는 현재당김Linux의 기능을 능가하고 history
이를 !
기반으로 구축되었습니다 .bash
저는 !!
및 같은 함수를 사용하는 데 익숙 !:<argc>
하지만, 예를 들어 이전에 잘못된 매개변수를 추가하여 실수를 한 경우 해당 잘못된 매개변수를 제거하고 명령줄을 다시 사용할 수 있는 방법이 있습니까?
예
다음과 같은 오류가 발생하면:
mv -r movableFolder/ targetFolder/
-r
옵션이 없으므로 몇 가지 트릭을 사용하여 이를 제거 mv
하고 싶습니다 .!
mv movableFolder/ targetFolder/
위의 기록 명령으로 다음을 수행할 수 있다는 것을 알고 있습니다.
mv !:2 !:3
하지만 대신 명령을 mv
사용할 수 있는 방법이 있나요 ?!
답변1
그러면 다음 예와 같이 매개변수 2와 3의 사용을 단순화할 수 있습니다.
$ echo -r movableFolder/ targetFolder/
-r movableFolder/ targetFolder/
$ echo !:2*
movableFolder/ targetFolder/
모든 것은 man bash에 문서화되어 있습니다:
단어 표시 단어 표시는 이벤트에서 원하는 단어를 선택하는 데 사용됩니다. A: 이벤트 사양을 단어 지정자와 분리하세요. ^, $, *, -, %로 시작하는 단어 표시는 생략할 수 있습니다. 단어는 줄의 시작 부분부터 번호가 매겨지며 첫 번째 단어는 0(영)으로 표시됩니다. 단어는 단일 공백으로 구분되어 현재 줄에 삽입됩니다.
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 word. This is usually the last argument, but will expand to the zeroth word if there is only one word in the line. % 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.
이벤트를 지정하지 않고 단어 지정자가 제공되면 이전 명령이 이벤트로 사용됩니다.
따라서 이 줄을 사용한 후:
$ echo -r movableFolder/ targetFolder/
echo -r movableFolder/ targetFolder/
이것은 작동합니다:
$ !:0 !:2*
movableFolder/ targetFolder/
이:
$ !:0 !:2-$
movableFolder/ targetFolder/
답변2
하하, 누군가가 아직도 이 고대 기능에 관심을 갖고 있어서 다행이네요. 나는 아직도 그것을 사용하지만 대부분의 경우 과거 명령을 기억하기 위해 위쪽 화살표를 사용합니다.
25년 전, \!
내 능력 중 하나 PS1
는 과거 주문의 번호를 매겨서 이렇게 기억하는 것이었습니다 !54
. 더 이상 유용하지 않다고 결정한 것이 언제인지 기억이 나지 않습니다. 지금은 주로 !!
, !-2
, 을 정기적으로 사용하지만 그 정도입니다.!-3
!$
!$:h
어쨌든, 당신은 두 가지 다른 것에 대해 묻는 것 같습니다.
이전 명령을 수정합니다.
$ mv -r from to $ !!:s/-r// mv from to
!:s/-r//
!!:s/-r//
. 수정자 대신 사용하여 첫 s/<string>/<replacement>/
번째 항목을 바꿀 수 있습니다 .<string>
<replacement>
주소 명령 이름
$ mv from to $ echo !:0 mv