type(Bash 内置函数)有什么用?

type(Bash 内置函数)有什么用?

我在 Bash 脚本中遇到了一个命令,其中我发现:

find /var/log/abcd -type f

上面的命令是在清理日志文件的情况下进行的。我知道有什么find作用。

看过之后-type f,我查看了它的手册页。我在手册页中看到了它BASH_BUILTINS(1)

命令下 -f 标志的描述type是:-

The -f option suppresses shell function lookup, as with the command builtin.

以下是我的问题:

  1. 有什么用type
  2. 国旗有什么意义-f
  3. type使用withfind命令有什么用?

[编辑]:-在阅读了到目前为止所有的评论和答案之后,我想谈谈我对-type option in command findVs的误解的原因type command。这一切都发生了,因为我假设到目前为止只看到了简短的选项(在命令的情况下进行测试find单个减号“-”, 例子,ls -l。大多数时候我都看到过很长的选择双减号“--”, 例子,ls --version

答案1

在这种情况下,type与 bash 内置无关type,稍后会详细介绍。

一点关于“类型”

BASH 内置type命令为您提供有关命令的信息。因此:

$ type type
type is a shell builtin

语法是:

type [-tap] [name ...]
  • -t:仅打印类型(如果找到)
  • -a:打印所有出现的命令,包括内置命令和其他命令。
  • -p:打印将在调用命令时执行的磁盘文件,或者不打印任何内容。

如果我们看time,kill并举cat个例子:

$ type time kill cat
time is a shell keyword
kill is a shell builtin
cat is /bin/cat

$ type -t time kill cat
keyword
builtin
file

$ type -a time kill cat
time is a shell keyword
time is /usr/bin/time
kill is a shell builtin
kill is /bin/kill
cat is /bin/cat

$ type -ta time kill cat
keyword
file
builtin
file
file

现在,这指定如果您在 Bash shell 中并输入,则使用time some_cmdbash 内置命令。time要使用该系统,time您可以执行以下操作/usr/bin/time some_cmd

确保使用系统命令(而不是内置命令)的一种常用方法是使用which.

tt=$(which time)

然后用来$tt调用系统time


有问题的命令

在这种情况下,它-type是命令的一个选项find。该选项采用一个参数来指定实体的类型。例子

find . -type f  # File
find . -type d  # Directory

还有更多,man find其余的请检查一下。

要搜索您可以执行的特定选项(在 man 中):

/^\s*-类型Enter

然后n用于下一个直到你找到它。


关于 shell 命令的一些知识

这有点个人的解读。

在这个特定的例子中,一些值得一提的事情是命令、选项、参数和管道。

这有点宽松,但在我的词汇中,我们简而言之:

  • 命令:一个程序或者内置
  • 参数:命令字之后的实体。
  • 选项:一个选修的范围。
  • argument:必需的参数。

在命令规范中,方括号用于指定选项,并且可以选择小于/大于,用于指定参数。因此:

foo [-abs] [-t <bar>] <file> ...
foo [-abs] [-t bar] file ...

给出-a -b-s作为可选参数,以及file必需参数。 -t是可选的,但如果指定则采用必需的参数bar。点表示可以占用多个文件。

这不是确切的规范,并且通常man需要help确定。

参数选项和输入的定位通常可能会混淆,但通常最好保持基于位置的方法,因为某些系统不处理参数的混合定位。举个例子:

chmod -R nick 722 foo
chmod nick 722 foo -R

两者都适用于某些系统,而后者则不适用于其他系统。


在您的确切命令中,所有参数都属于find– 因此,如果您想知道某个属性man find是正确的查找位置。如果您需要查看 shell 等的手册页,可以在例如:

find . $(some command)
find . `some command`
find . $some_var
find . -type f -exec some_command {} \;
find . -type f | some_command
...

-exec一种特殊的参数,其中-exec some_command {} \;所有参数都赋予find,但该部分在tosome_command {} \;内进行了扩展。findsome_command string_of_found_entity


进一步

  • 引用
  • 扩张
  • 命令替换
  • 还有更多

您可能会发现这很有用

答案2

你应该查看 in man find,而不是help typeor man bashtypeinfind将指定您需要的文件类型:

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

内置type是完全不同的东西,它不是内部使用的find

答案3

您查看了错误的手册页,这不是命令type -f,而是find -type f完全不同的选项,请查看find手册以获取正确的解释。

答案4

这不是您正在查看的正确手册页。你应该使用

man find

这会告诉您谓词-type f-type选择常规文件。

相关内容