Al intentarlo, watch bash -c 'du -h /etc/passwd && df -h'
parece que la ruta al archivo se ignoró por completo y, en su lugar, du -h
se ejecutó a través del directorio de trabajo actual. Se observó el mismo resultado cuando ejecuté watch bash -c 'stat /etc/passwd && df -h'
y stat
regresé con stat: missing operand
error. Por el contrario, usar watch -e "command /path/to/file"
o watch "command /path/to/file"
funciona sin problemas.
¿Por qué no funciona watch bash -c 'du -h /etc/passwd && df -h'
entonces? ¿Es watch
un problema o bash
un problema con la división del argumento?
Respuesta1
watch
ejecuta comandos con argumentos pasándolos a sh -c
, entonces lo que terminas ejecutando es:
sh -c 'bash -c du -h /etc/passwd && df -h'
El shell que estás ejecutando elimina la primera capa de comillas que aplicaste. Luego -h
, /etc/passwd
se pasan como $0
y $1
a bash, por lo que efectivamente se ignoran. Ejecute algo como:
watch 'du -h /etc/passwd && df -h'
watch "bash -c 'du -h /etc/passwd && df -h'"
Para verificar, usando strace
:
strace -fe execve -o log watch bash -c 'du -h /etc/passwd && df -h'
Y log
contiene:
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 +++