Bash e seu comando de exclamação, visualiza o comando real antes de executá-lo?

3

! como um prefixo para alguma string executará qualquer comando no buffer de comando que comece com a string (parcial) dada. Há também alguns outros usos para isso. Veja por exemplo Entendendo o ponto de exclamação (!) no bash

Minha pergunta é: como posso visualizar qual comando será executado antes de executá-lo? Por exemplo. se eu fizer !for , e eu escrevi vários comandos começando com 'for' anteriormente, mas eu não tenho certeza se aquele que eu acho que foi o último é de fato o que eu acho. Seria muito útil se o bash pudesse me mostrar o que o comando que seria executado antes de eu realmente executá-lo. Existe alguma maneira de fazer isso em bash?

    
por AttributedTensorField 31.05.2015 / 21:20

5 respostas

4

O Bash herdou o mecanismo ! de csh . A maneira de visualizar seu comando em ambos os shells é adicionar um :p ao final.

!for:p
    
por 01.06.2015 / 00:47
3

Você pode usar a opção histverify shell:

histverify
    If set, and readline is being used, the results of history substitution
    are not immediately passed to the shell parser.  Instead,
    the resulting line is loaded into the readline editing buffer,
    allowing further modification.

Exemplo:

$ shopt -s histverify
$ !shopt

Outra opção útil é histreedit :

histreedit
    If set, and readline is being used, a user is given the opportunity
    to re-edit a failed history substitution.
    
por 20.06.2015 / 05:38
2

Eu geralmente me abster de (IMO quebrado) ! substituição e usar as funções de histórico do shell; por exemplo. em modo-vi (você certamente encontrará opções equivalentes em emacs-mode ) você procuraria pela última ocorrência, com o seu exemplo que seria <Esc> / for <Enter> e (se não for o comando desejado) repita a pesquisa para a próxima aparição de for usando a chave n (ou N para ir na outra direção) e confirme comando desejado com <Enter> .

    
por 31.05.2015 / 21:36
1

Você pode mapear readline commands history-search-backward e history-search-forward para algo (estou usando PgUp e PgDown ) e usá-los para navegar pelo histórico de ! .

    
por 31.05.2015 / 21:37
0

Se você estiver usando o modo vi ( set -o vi ), clique em Esc ou C-[ e k ou UP para subir no histórico e j ou DOWN para ir para baixo. Você pode editar o que você chegou ou executar com Enter .

    
por 31.05.2015 / 22:11