ディレクトリ内のファイル数を表示しようとしています/tmp/
。これを行うには、次のコマンドが機能すると思います。
watch sh -c 'ls /tmp/|wc -l'
ls
しかし、議論なしに動作するようです。つまり、私はにあり、~
代わりにそこにあるファイルの数を得ています/tmp/
。うまくいくように見える解決策を見つけました。
watch sh -c 'ls\ /tmp/|wc -l'
ls
しかし、なぜ私との間のスペースを抜けなければなりませんか/tmp/
?出力はに提供されますが、引数watch
に渡されないようにコマンドをどのように変換できますか?ls
wc
/tmp/
ls
ベストアンサー1
違いは、次の方法で確認できますstrace
。
$ strace -ff -o bq watch sh -c 'ls\ /tmp/|wc -l'
^C
$ strace -ff -o nobq watch sh -c 'ls /tmp/|wc -l'
^C
$ grep exec bq* | grep sh
bq.29218:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls\\ /tmp/|wc -l"], [/* 54 vars */]) = 0
bq.29219:execve("/bin/sh", ["sh", "-c", "sh -c ls\\ /tmp/|wc -l"], [/* 56 vars */]) = 0
bq.29220:execve("/bin/sh", ["sh", "-c", "ls /tmp/"], [/* 56 vars */]) = 0
$ grep exec nobq* | grep sh
nobq.29227:execve("/usr/bin/watch", ["watch", "sh", "-c", "ls /tmp/|wc -l"], [/* 54 vars */]) = 0
nobq.29228:execve("/bin/sh", ["sh", "-c", "sh -c ls /tmp/|wc -l"], [/* 56 vars */]) = 0
nobq.29229:execve("/bin/sh", ["sh", "-c", "ls", "/tmp/"], [/* 56 vars */]) = 0
にls /tmp
単一引数として渡されるバックティックの場合、期待どおりに機能します。このバックティックがない場合、コマンドは実行時にトークン化され、提供されたものを実行するため、引数としてのみ渡されます。つまり、subziは基本コマンドのみを実行し、現在の作業ディレクトリの内容を一覧表示します。-c
sh
watch
sh
sh
ls
-c
sh
ls
それではなぜ複雑になるのでしょうかsh -c ...
?なぜそれだけ走らないのですかwatch 'ls /tmp|wc -l'
?