`watch` 中的链接命令

Fak*_*ame 3 shell watch busybox

好吧,这让我有点发疯。

我正在尝试查看一组子目录中的文件数。

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.

这也是一个嵌入式设备,因此它运行的是 busybox ( BusyBox v1.1.0 (2010.06.14-02:47+0000) multi-call binary) 而不是普通的 gnu 实用程序,因此大多数常用工具的大多数开关和功能也不存在。

所以必须考虑到这一点。然而,linux 安装被烘焙到一个磁盘模块上,所以没有简单的方法来更新它。

相同的命令 ( watch 'find . | wc -l') 在更新的 linux 安装上正常工作,所以这个问题更多地是关于处理过时的 bash 那么这个确切的片段有什么问题(因为它在其他地方似乎是正确的!)。

Sté*_*las 10

根据您的实现/版本watch,它可能不会启动 shell 来解释命令行,而是运行一个命令,该命令将它自己收到的参数作为参数。因此,在这种情况下,如果您需要它来运行 shell 命令行,则需要显式启动 shell,如下所示:

watch sh -c 'find . | wc -l'
Run Code Online (Sandbox Code Playgroud)

另请参阅inotifywait -rm .命令(如果在 Linux 上)以监视目录中的活动。

另请注意,如果文件名不包含换行符,则find . | wc -l仅返回文件数(不包括..条目)。如果这可能是一个问题,你可以这样做:

find .//. | grep -c //
Run Code Online (Sandbox Code Playgroud)

另请注意,名称中没有 GNU 或 Unix 实用程序watch。Linux 工具套件中有一个watch命令,busybox 中procps有一个watch实现。在 BSD 上,watch做一些完全不同的事情。watch不是标准命令(在 POSIX、Unix 或 LSB 规范中都没有)。