Como acessar o último argumento de um comando comentado

4

Eu acho que . ( alt . para muitos outros) é muito útil quando se trabalha em um terminal, inserindo o último argumento da última linha no prompt atual. No entanto, não funciona quando a última linha foi comentada (assumindo set -o interactivecomments ).

Não consigo pensar em um caso de uso exato, mas já aconteceu várias vezes que eu tenha comentado um comando que percebi antes da execução para não ser o que eu precisava naquele momento e, em seguida, queria o argumento final de em um comando subseqüente.

Eu percebo que há uma lógica em ignorar tudo o que foi comentado, já que ele nunca é interpretado e, portanto, nada é transformado em argumentos, mas existe alguma maneira em tudo para fazer o que eu quero?

Não seria ideal - mas seria utilizável - se eu tivesse que usar uma tecla diferente, vinculada a um comando alternativo que faria o que eu quisesse.

Estou usando o Zsh, mas uma solução Bash pode funcionar ou estar perto do que eu preciso fazer no Zsh.

    
por iconoclast 15.04.2018 / 00:45

4 respostas

4

Não comente o comando.

Em vez disso, coloque um : na frente, em vez de um # . Isso fará com que seus argumentos de texto de comando para o utilitário null : , que não faz nada quando executado . Os argumentos são tokenised e analisados, porque ainda é um comando, mas nada mais é feito com eles.

Há casos em que isso não é adequado: em particular, quando descobrir o comando em si tem efeitos colaterais. Um exemplo simples é a substituição de comandos :

$ : log $(find -print -delete) --target /var/run/cache

Nesse caso, o comando dentro de $(...) seria executado e substituído nos argumentos para : , mesmo que o próprio comando original nunca fosse executado. Um caso menos destrutivo seria a ${foo:=default} expansão do parâmetro , que tem o efeito colateral de atribuir um valor a $foo .

Por fim, redirecionamentos ou canais ainda ocorrerão:

$ : foo > outfile
$ : bar | grep x | ...

em ambos os casos, enviará uma saída vazia para o destino, que truncará ou criará o arquivo ou executará os comandos subsequentes, que podem não gostar da entrada vazia que recebem.

Se você não tem nenhuma dessas preocupações especiais para o seu comando, isso é totalmente seguro e funciona em zsh , Bash , e qualquer shell compatível com POSIX (embora o comportamento depois não funciona em todos os lugares).

Se for especificamente a última palavra que você deseja, o zsh fornece atalhos de teclado e comandos personalizáveis que você pode usar para manipular a linha de comando. Se você bindkey '^K' kill-region , então você pode voltar antes da palavra, Ctrl - K para apagar até o início da linha, : , e, em seguida, ter um comando seguro com apenas a palavra que lhe interessa.

    
por 15.04.2018 / 01:32
3

Você pode fazer isso com comentários também; você não precisa mudar para : se estiver disposto a usar um atalho diferente:

  1. Defina uma função que produz seu último parâmetro posicional:

    lastarg () { test $# -eq 0 && return 1; while [ $# -gt 1 ]; do shift; done; printf '%s' $1; }
    
  2. Crie uma ligação de chave que chama:

    lastarg $(history 2 | head -1)
    

    e insere a saída.

Isso pode levar a resultados incorretos devido à divisão de palavras no caso de o último argumento ser citado.

versão perigosa para citar

Se você tiver certeza de que nada de ruim pode acontecer (não < , > , & , $() , \'', ; , # , and no0 single " or " "sem aspas) você pode fazer isso para obter um último "argumento" entre aspas de uma linha de comentário:

# dummy foo\ \ \ bar
eval : $(history 2 | awk 'NR==1 { sub(" *[0-9]* *#",""); print; }') \; echo '"$_"'
    + eval : dummy 'foo\' '\' '\' bar ';' echo '"$_"'
    ++ : dummy 'foo   bar'
    ++ echo 'foo   bar'
    foo   bar
    
por 15.04.2018 / 02:01
2

Use o shell embutido !$ que corresponde ao último argumento.

Estou usando o zsh também e isso funciona para acessar o último argumento de um comando comentado para mim no shell.

    
por 15.04.2018 / 03:52
1

Você pode adicionar ao seu ~/.zshrc :

zshaddhistory() {
  local histchars=
  print -Sr -- ${1%$'\n'}
  fc -p
}

Ou seja, na função de gancho especial zshaddhistory chamada antes que a linha de comando atual seja adicionada ao histórico, adicione-a com um vazio histchars , o que desabilitaria o processamento de comentários para print -S . fc -p garante que a linha de comando não seja adicionada mais uma vez ao histórico.

    
por 15.04.2018 / 17:31

Tags