Ao tentar, 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
retornei com stat: missing operand
erro. Por outro lado, usar watch -e "command /path/to/file"
or watch "command /path/to/file"
funciona sem problemas.
Por que não funciona watch bash -c 'du -h /etc/passwd && df -h'
então? É watch
um problema ou bash
um problema com a divisão de argumentos?
Responder1
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 aspas aplicadas. Os -h
, /etc/passwd
são então passados como $0
e $1
para bash, portanto são efetivamente ignorados. Execute 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 +++