Posso fazer com que meu histórico de shell registre como os curingas foram expandidos?

6

Se eu correr:

$ ls *
foo bar buzz
$ history | tail -1
ls *

Você pode ver que no meu histórico de shell ele lembra que eu executei ls * em vez de ls foo bar buzz . Idealmente, gostaria de gravar ambos em histórias separadas. Quando eu me pergunto, "o que diabos aconteceu para arquivar foo?", Seria bom poder ter uma maneira de voltar e descobrir que eu fiz rm * no diretório errado, pesquisando através da minha história e encontrando ' foo '.

Estou interessado em soluções para zsh e bash.

    
por Joseph Garvin 29.04.2011 / 18:17

1 resposta

4

Eu não acho que qualquer shell faça nada além do espaço em branco ao armazenar comandos no histórico. O que * expandido não está registrado e parece não haver uma opção para registrá-lo.

Note que não seria possível gravar com toda a generalidade de qualquer maneira. Por exemplo, se você executar a='foo* bar*'; rm $a ( rm $=~a in zsh), é improvável que o shell detecte a correspondência de caractere curinga sintaticamente. E não há opção para registrar todas as expansões glob.

Você poderia remendar algo junto com preexec (ou the bash equivalent ). Primeiro teste não testado (para zsh):

history_wildcards=()
precmd () {
  emulate -LR zsh
  local n tmp
  history -1 | read n tmp
  history_wildcards[$(($n+1))]=$=~1
}

Isso preenche o array history_wildcards em uma string com a expansão glob de cada palavra na linha de comando. A divisão de palavras é executada de maneira ingênua, então algo como echo ' /**/* ' expandirá /**/* (ou seja, percorra seu disco). Não espere nada útil em cd subdir && echo * ou em algo tão incompreensível.

Se você planeja de antemão, você pode fazer zsh expandir os curingas antes de enviar o comando. Na configuração padrão, basta pressionar Tab quando o cursor estiver no glob. Se você configurou a conclusão de forma diferente, tente ^X * ( expand-word ).

    
por 30.04.2011 / 00:34