El comando watch con shell no reconoce nombres de archivos

El comando watch con shell no reconoce nombres de archivos

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 -hse 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 statregresé con stat: missing operanderror. 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 watchun problema o bashun problema con la división del argumento?

Respuesta1

watchejecuta 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/passwdse pasan como $0y $1a 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 logcontiene:

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 +++

información relacionada