基本命令问题

基本命令问题

我试图弄清楚这些命令(对于一个学校项目)有什么区别,但对我来说它被破坏或运行了超过 10 分钟~

所以,样本:

sudo find / -type f -exec 文件 '{}' ; | grep 'Shell 脚本' |厕所-l

差异:

#在 {} 处不带“”

  1. sudo find / -type f -exec file {} \; | grep ’Shell script’ | wc -l
    

#没有\

  1. sudo find / -type f -exec file ’{}’ ; | grep ’Shell script’ | wc -l
    

#grep 命令后不带 ' '

  1. sudo find / -type f -exec file ’{}’ \; | grep Shell script | wc -l
    

感谢您的时间和帮助。

答案1

首先,您需要使用直引号 ( '),而不是印刷引号,如 Steeldriver 所指出的。

其次,引号存在与否的影响会对命令本身接收的内容产生影响:

例如,您可以:

echo 'semicolon ; echo message'

此处,命令 echo1 与参数一起运行semicolon ; echo message。因此输出将是一行

分号 ;回显消息

现在假设没有引号:

echo semicolon ; echo message

程序 echo 将以完全相同的方式运行(打印参数)。然而,不同之处在于,由于 是;shell 的特殊字符,因此 shell 本身会以不同的方式将该行视为两个命令:

  • 回显分号
  • 回显消息

输出将是:

分号消息

您的行中有三个地方可以引用或不引用:

  • {}

如上所述GNU 查找并屏蔽某些 shell 的 {} - 哪个? 最多shell 不需要引用独立的 {},因此不会产生任何影响。

  • ;

find需要 a;来完成单个参数-exec。由于;shell 的特殊性,它需要被引用(作为\;,';'";",没关系,只是不作为文字;)。否则,shell 会将其解释为查找命令,然后是以管道 ( |) 开头的第二个命令,这会导致 shell 错误:

意外标记“|”附近出现语法错误

  • Shell script

对于grep你有两个非常不同的输出。在第一种情况下,您使用单个参数 ( Shell script) 调用 grep。在另一种情况下,它是用两个参数(first Shell,second script)调用的。鉴于 grep 的工作方式,在第一种情况下,它将查找在其输入中收到的包含文本的行外壳脚本。在第二个中,它将查找包含文本的行在名为script.这是完全不同的行为。

这些信息应该让您弄清楚哪一行是运行的正确行,以及这样编写的原因。

1 实际上会调用一个 shell 内置函数,但我们假设它是独立/bin/echo运行的。


最后,正确的路线可以做三件事。

  • 运行命令file_在系统的每个文件上`
  • 选择包含文本的那些行(描述这些文件)外壳脚本
  • 计算行数(以及 shell 脚本的行数)

(最后一个命令相当于使用grep -c

因此,只有在运行程序数千次(文件系统中的每个条目一次)之后,您才会收到命令的输出(这是一个数字),因此运行时间较长很正常

您可以在跳过的文件夹中运行它,/因此它只搜索该子树。

tee /dev/stderr查看它正在做什么的另一种方法是在管道上插入:

find / -type f -exec file {} \; | tee /dev/stderr | grep "Shell script" | wc -l

相关内容