O comando watch com shell não reconhecendo nomes de arquivos

2

Durante a tentativa de watch bash -c 'du -h /etc/passwd && df -h' , parece que o caminho para o arquivo foi completamente ignorado e, em vez disso, du -h percorreu o diretório de trabalho atual. O mesmo resultado foi observado quando executei watch bash -c 'stat /etc/passwd && df -h' e stat retornou com stat: missing operand erro. Por contraste, usar watch -e "command /path/to/file" ou watch "command /path/to/file" funciona sem problemas.

Por que o watch bash -c 'du -h /etc/passwd && df -h' não funciona? É o problema de watch ou o problema de bash com a divisão de argumentos?

    
por Sergiy Kolodyazhnyy 31.10.2017 / 02:57

1 resposta

5

watch executa comandos com argumentos passando-os para sh -c , então o que você acaba executando é:

sh -c 'bash -c du -h /etc/passwd && df -h'

O shell que você está executando remove a primeira camada de cotações aplicada. Os -h , /etc/passwd são passados como $0 e $1 para bash, então eles são efetivamente ignorados. Corra algo como:

watch 'du -h /etc/passwd && df -h'
watch "bash -c 'du -h /etc/passwd && df -h'"

Para verificar, use strace :

strace -fe execve -o log watch bash -c 'du -h /etc/passwd && df -h'

E log contém:

17132 execve("/usr/bin/watch", ["watch", "bash", "-c", "du -h /etc/passwd && df -h"], [/* 40 vars */]) = 0
17134 execve("/bin/sh", ["sh", "-c", "bash -c du -h /etc/passwd && df "...], [/* 42 vars */]) = 0
17135 execve("/bin/bash", ["bash", "-c", "du", "-h", "/etc/passwd"], [/* 42 vars */]) = 0
17135 execve("/usr/bin/du", ["du"], [/* 42 vars */]) = 0
17135 +++ exited with 0 +++
    
por muru 31.10.2017 / 03:14