为什么以下 bash 命令无法正常工作?

Nli*_*tis 2 bash redirect

我有以下 bash 命令:

$(ls -l /var/ | grep www) > cat folder_exists
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作。我希望实现的是一个命令,它检查文件夹内是否有 www 文件/var/夹,并将该特定命令的结果打印到文件folder_exists. 我也试过多次重新输入命令,给出的例子

cat $(ls -l /var/ | grep www) > folder_exists
Run Code Online (Sandbox Code Playgroud)

甚至

cat $(ls -l /var | grep www) > folder_exists
Run Code Online (Sandbox Code Playgroud)

以防万一斜线造成了伤害,但无济于事。

我的问题是,即使我正在创建文件folder_exists,我也无法将输出打印到它。有人可以告诉我我哪里出错了吗?

Jan*_*ary 8

最好这样做:

if [ -d /var/www ] ; then touch folder_exists ; else touch folder_absent ; fi
Run Code Online (Sandbox Code Playgroud)

该命令的第一个版本执行以下操作:$( ... )首先由.... 由于您调用 ls -l | grep www,你要么得到一个包含多个单词的行,要么什么都没有。在第一种情况下,它试图被执行,但这没什么意义。如果你打字你会得到什么

drwxr-xr-x 15 root root     4096 Aug 20 13:48 log
Run Code Online (Sandbox Code Playgroud)

在命令提示符下?没有名为 的命令drwxr-xr-x。如果您使用该cat $( ls -l /var | grep www)表单,则首先将 the$( ... )替换为由 生成的内容...,然后 cat 将其解释为 cat 的文件列表(以drwxr-xr-x;开头,很可能没有这样的文件)。

此外,如果你尝试做这样的事情:

command > cat file
Run Code Online (Sandbox Code Playgroud)

将会发生的是,它cat被解释为一个文件名来存储 的输出command,而不是一个命令。要解释cat为命令,您需要一个管道符号,就像您在 ls | 中正确使用的那样 格雷普:

command | cat
Run Code Online (Sandbox Code Playgroud)

但是,如果您的目的是将命令的输出存储在文件中,那么只需使用

command > file
Run Code Online (Sandbox Code Playgroud)

事实上,你可以这样做

ls /var | grep www > file
Run Code Online (Sandbox Code Playgroud)

仅当 ls 中没有 www 文件夹时,此文件才会为空。但要小心!如果有文件夹 /var/ewwwocks,则该文件还将包含一行。最好简单地使用

ls /var/www > file
Run Code Online (Sandbox Code Playgroud)

长话短说,使用条件构造 if ... ; 然后 ... ; 别的 ... ; 菲