É possível substituir / alterar um argumento usando bash bang (!) e histórico

1

Atualmente estou desmaiando sobre o history e ! em destaque para bash no Linux.

Estou me acostumando a usar !! e !:<argc> e recursos semelhantes, mas há alguma maneira, por exemplo, se eu cometer um erro adicionando um argumento errado anteriormente e, em seguida, eu poderia remover esse argumento falso e usar o comando linha novamente.

Exemplo

Se eu cometer um erro como o seguinte:

      mv -r movableFolder/ targetFolder/

como não há -r opção para mv , gostaria de removê-lo usando um truque de ! para torná-lo:

      mv movableFolder/ targetFolder/

Eu sei que posso fazer a partir do comando de histórico acima:

     mv !:2 !:3

mas existe mesmo assim para substituir mv por um comando ! ?

    
por Shan-Desai 09.02.2017 / 21:09

2 respostas

2

Hoho, eu estou feliz que ainda haja alguém interessado neste recurso antigo. Eu ainda uso, mas na maioria das vezes eu me encontro usando a seta para cima para lembrar os comandos anteriores.

Há vinte e cinco anos, eu tinha \! como um componente do meu PS1 para poder numerar os comandos anteriores e recuperá-los como !54 . Não me lembro quando decidi que não era mais útil ... Agora eu uso !! , !-2 , !-3 e acima de tudo !$ e !$:h frequentemente, mas não muito mais.

De qualquer forma, você parece perguntar duas coisas diferentes:

  • Corrija o comando anterior:

    $ mv -r from to
    $ !!:s/-r//
    mv  from to
    

!:s/-r// pode ser usado em vez de !!:s/-r// . O modificador s/<string>/<replacement>/ substitui a primeira ocorrência de <string> por <replacement> .

  • Nome do comando de endereço

    $ mv from to
    $ echo !:0
    mv
    
por 10.02.2017 / 00:14
1

Bem, você pode simplificar o uso dos argumentos 2 e 3, como neste exemplo:

$ echo -r movableFolder/ targetFolder/
-r movableFolder/ targetFolder/

$ echo !:2*
movableFolder/ targetFolder/

Tudo está documentado no homem 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 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.

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

E, portanto, após essa linha ter sido usada:

$ echo -r movableFolder/ targetFolder/
echo -r movableFolder/ targetFolder/

isso funcionará:

$ !:0 !:2*
movableFolder/ targetFolder/

Também isso:

$ !:0 !:2-$
movableFolder/ targetFolder/
    
por 10.02.2017 / 00:24