Estoy tratando de ver el número de archivos en mi /tmp/directorio. Para esto pensé que este comando funcionaría:
watch sh -c 'ls /tmp/|wc -l'
Pero parece funcionar como si lsno tuviera argumentos. A saber, estoy dentro ~, y obtengo el número de archivos allí en lugar de /tmp/. Encontré una solución, que parece funcionar:
watch sh -c 'ls\ /tmp/|wc -l'
Pero, ¿por qué necesito escapar del espacio entre lsy /tmp/? ¿Cómo se transforma el comando watchpara que la lssalida se alimente wc, pero /tmp/no se pase como argumento ls?

watch "sh -c 'ls /tmp | wc -l'"hacer este comando debería obtener el efecto deseado. Esto no es culpa de los relojes, intentesh -c ls /tmpy obtendrá su directorio de inicio (pero no tengo idea de por qué ...)watchde forma incorrecta .El comando que se pasa awatchsu vez es alimentado porwatchash -c, por lo que está haciendo en efectosh -cdos veces./tmpes un argumento parash, en ese caso, no un argumento parals.Respuestas:
La diferencia se puede ver a través de
strace:En el caso de la comilla inversa,
ls /tmpse pasa como un argumento único a-ctosh, que se ejecuta como se esperaba. Sin esta comilla inversa, el comando se divide en palabras cuando sewatchejecuta,shque a su vez ejecuta el suministradosh, de modo que sololsse pasa como argumento a-c, lo que significa que el sub-subshsolo ejecutará unlscomando simple y enumera el contenido del trabajo actual directorio.Entonces, ¿por qué la complicación de
sh -c ...? ¿Por qué no simplemente correrwatch 'ls /tmp|wc -l'?fuente
strace.ls /tmpes ..." y "Sin esta comilla invertida , el comando es ...", y usabqynobqcomo nombres de archivo, cuando todo se refiere a la barra invertida en suls\ /tmpcomando.Hay dos categorías principales de
watchcomandos (de los que se van a ejecutar comandos periódicamente,watchno es un comando estándar, incluso hay sistemas en los quewatchhace algo completamente diferente como espiar en otra línea tty en FreeBSD).Uno que ya pasa la concatenación de sus argumentos con espacios a un shell (en efecto llama
sh -c <concatenation-of-arguments>) y otro que simplemente ejecuta el comando especificado con los argumentos especificados sin invocar un shell.Estás en la primera situación, así que solo necesitas:
Cuando tu lo hagas:
tu
watchrealmente corre:Y
sh -c ls /tmp/ejecuta ellsscript en línea donde$0está/tmp/(por lo quelsse ejecuta sin argumentos y enumera el directorio actual).Algunas de las
watchimplementaciones en la primera categoría (como la de procps-ng en Linux) aceptan una-xopción para que se comporten como laswatchde la segunda categoría. Entonces, allí, puedes hacer:fuente