Estou tentando assistir o número de arquivos no meu /tmp/
diretório. Por isso, pensei que este comando funcionaria:
watch sh -c 'ls /tmp/|wc -l'
Mas parece funcionar como se ls
não tivesse argumentos. Ou seja, estou dentro ~
e recebo o número de arquivos lá em vez de /tmp/
. Encontrei uma solução alternativa, que parece funcionar:
watch sh -c 'ls\ /tmp/|wc -l'
Mas por que preciso escapar do espaço entre ls
e /tmp/
? Como o comando é transformado watch
para que a ls
saída seja alimentada wc
, mas /tmp/
não seja passada como argumento para ls
?
watch "sh -c 'ls /tmp | wc -l'"
esse comando deve ter o efeito desejado. Isto não é relógios culpa, tentativash -c ls /tmp
e você vai ter a sua pasta pessoal (mas não tenho idéia do porquê ...)watch
incorretamente .O comando que você passa parawatch
por sua vez é alimentada porwatch
quesh -c
, então você está na verdade fazendosh -c
duas vezes./tmp
argumento ésh
, nesse caso, não o argumentols
.Respostas:
A diferença pode ser vista através de
strace
:No caso da citação retroativa,
ls /tmp
é passado como um único argumento para o-c
parash
, que é executado conforme o esperado. Sem essa citação retroativa, o comando é dividido em palavras quandowatch
executado,sh
que por sua vez executa o fornecidosh
, para que apenasls
seja passado como argumento para-c
, o que significa que o sub-subsh
apenas executará umls
comando bare e lista o conteúdo do trabalho atual. diretório.Então, por que a complicação de
sh -c ...
? Por que não simplesmente correrwatch 'ls /tmp|wc -l'
?fonte
strace
.ls /tmp
é ..." e "Sem esta crase , o comando é ...", e os usosbq
enobq
como nomes de arquivos, quando ao mesmo tempo se referindo à barra invertida em seuls\ /tmp
comando.Existem duas categorias principais de
watch
comandos (dos que devem executar comandos periodicamente,watch
não é um comando padrão, existem até sistemas emwatch
que algo completamente diferente é como bisbilhotar em outra linha tty no FreeBSD).Um que já passa a concatenação de seus argumentos com espaços para um shell (na verdade, chama
sh -c <concatenation-of-arguments>
) e outro que apenas executa o comando especificado com os argumentos especificados sem chamar um shell.Você está na primeira situação, então só precisa de:
Quando você faz:
seu
watch
realmente é executado:E
sh -c ls /tmp/
está executando ols
script embutido onde$0
está/tmp/
(assimls
é executado sem argumentos e lista o diretório atual).Algumas das
watch
implementações na primeira categoria (como a do procps-ng no Linux) aceitam uma-x
opção para fazê-las se comportar como awatch
da segunda categoria. Então, com lá, você pode fazer:fonte