Use o comando run anterior como um argumento com escape adequado

1

Um caso de uso comum para mim é executar um comando no terminal, esse comando pode ser longo, conter pipes grep | awk | sort , aspas de todos os tipos ' " , aspas escapadas entre aspas "\"somethings\"" etc.

Mas pode acontecer de eu ter que executar esse mesmo comando várias vezes. Para comandos simples eu uso watch como assim

watch -n 5 'ls -l | wc -l'

Mas se o comando for longo e contiver aspas, torna-se muito tedioso e propenso a erros para escapar de tudo antes de passar para watch .

Alguns atalhos ou formas internas para obter uma string com escape adequado do comando anterior seriam bons. Existe algum? Eu tentei cegamente $ watch -n 5 ! e $watch -n 5 '!' , mas não funcionou.

    
por xaxa 19.07.2016 / 14:59

1 resposta

3

Embora, watch não tenha histórico de comandos, o histórico de shell pode ser usado para essa finalidade. fc -nl -1 permite listar os comandos anteriores executados pelo shell. Pode-se fazer

PCMD='fc -nl -1'; watch -n 5 $PCMD

Ou ainda mais curto

watch -n 5 $(fc -nl -1)

Exemplo,

$> stat /etc/passwd                                                                                           
  File: '/etc/passwd'
  Size: 2989        Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 6030444     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-06-17 20:45:17.520447811 -0600
Modify: 2016-06-17 20:45:17.520447811 -0600
Change: 2016-06-17 20:45:17.528447711 -0600
 Birth: -
$> watch -n 5 $(fc -nl -1)    
    
por Sergiy Kolodyazhnyy 19.07.2016 / 16:05