Como executar o comando watch na expressão com pipes?

6

Eu aprendi hoje o maravilhoso comando shuf:

ls | shuf  

mostra-me uma listagem do diretório de trabalho, mas graças ao shuf toda vez que executo esta expressão de comando canalizada com outro pedido.

Então eu pensei, por que não repetir essa expressão a cada segundo de novo, e então eu tentei

watch -n1 ls | shuf          (and got no output)
watch -n1 (ls | shuf)        (and got an error)
watch -n1 {ls | shuf}        (and got an error)

então eu coloquei ls | Shuf em seu próprio arquivo e fez um script foo fora dele.

watch -n1 ./foo               (this times it worked)

É possível aplicar o comando watch em uma expressão de comando canalizada sem que a expressão seja transformada em um arquivo de script?

    
por Abdul Al Hazred 29.03.2015 / 23:55

1 resposta

7

Existem várias variantes de um comando watch, algumas que geram um shell para interpretar uma linha de comando feita da concatenação dos argumentos passados para watch (com caracteres de espaço no meio). Naqueles que você pode fazer:

watch 'ls | shuf'

o mesmo que:

watch ls '|' shuf

(os watch são realmente executados: "/bin/sh", ["sh", "-c", "ls | shuf"] e são bastante perigosos porque o segundo nível de interpretação pode abrir as portas para bugs e problemas de segurança quando não previstos, o relógio do processado pode evitar esse comportamento com o -x opção).

E há aqueles que apenas executam o comando cujo nome é dado no primeiro argumento com todos os argumentos como argumentos. Nesses:

watch sh -c 'ls | shuf'
    
por 30.03.2015 / 00:01