web-dev-qa-db-ja.com

`watch`内のコマンドの連鎖

わかりました、これは私を少し狂わせています。

サブディレクトリのセット内のファイルの数を監視しようとしています。

_find . | wc -l_は、サブフォルダーとファイルの数を正しく返します。

ただし、_watch 'find . | wc -l'_はウォッチ画面に_watch: find . | wc -l: No such file or directory_を返します。
二重引用符または逆引用符( `)で同じものを返します。


これは古代バージョンのbashにあります:
_GNU bash, version 3.00.16(2)-release (i486-slackware-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.
_

これも組み込みデバイスであるため、通常のgnuutilsではなくbusybox(BusyBox v1.1.0 (2010.06.14-02:47+0000) multi-call binary)を実行しているため、ほとんどの一般的なツールのほとんどのスイッチと機能もありません。

したがって、それを考慮に入れる必要があります。ただし、Linuxのインストールはディスクオンモジュールに組み込まれているため、簡単に更新する方法はありません。

同じコマンド(_watch 'find . | wc -l'_)は、最近のLinuxインストールで正しく機能するため、この質問は、古いbashの処理に関するものであり、この正確なスニペットの何が問題になっているのか他の場所では正しいようです!)。

3
Fake Name

watchの実装/バージョンによっては、コマンドラインを解釈するためにシェルを起動しない場合がありますが、代わりに、受け取った引数を引数として取るコマンドを実行します。したがって、その場合、シェルコマンドラインを実行するために必要な場合は、次のように明示的にシェルを開始する必要があります。

watch sh -c 'find . | wc -l'

ディレクトリ内のアクティビティを監視するには、inotifywait -rm .コマンド(Linuxの場合)も参照してください。

また、find . | wc -lは、ファイル名に改行文字が含まれていない場合にのみ、ファイルの数(..エントリを除く)を返すことに注意してください。それが問題になる可能性がある場合は、次のことができます。

find .//. | grep -c //

また、watchという名前のGNUまたはUnixユーティリティはありません。watchのツールスイートにはprocpsコマンドがあります。 Linuxでは、busyboxにwatchの実装があります。BSDでは、watchはまったく異なることをします。watchは標準コマンドではありません(POSIX、Unix、LSBのいずれの仕様でも) 。

9