bash bang(!) 및 기록을 사용하여 매개변수를 교체/변경하는 것이 가능합니까?

bash bang(!) 및 기록을 사용하여 매개변수를 교체/변경하는 것이 가능합니까?

나는 현재당김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
    

관련 정보