Bash:类型(Bash内置函数)有什么用?


16

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

find /var/log/abcd -type f

上面的命令是在清理日志文件的上下文中。我知道是什么find呢。

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

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

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

以下是我的问题:

  1. 有什么用type
  2. -f标志的意义是什么?
  3. 使用typewith find命令有什么用?

[编辑]:-在阅读完所有评论和答案后,我想提及我对-type option in command findVs的误解的原因type command。之所以如此,是因为我一直假设并且直到现在为止都只看到find带有一个减号'-'的简短选项(在命令情况下为Tests ),例如ls -l。在大多数情况下,我看到带有双减号'-'的长期权,例如ls --version


1
type内置命令不使用find。该-type选项find做别的事情。查看help typeman find获取您的答案。

1
这种具体的误解非常具体,不太可能帮助别人解决问题
Anthon

9
为什么要投票?虽然该问题确实表明OP对Unix并不了解很多,但是以这些理由否决一个问题是不正确的。Akshay甚至阅读了手册页,大多数人在这里问问题都不会这样做。
斯特凡Chazelas

请考虑改写您的问题标题,因为您当前的标题正在阻止真正在寻找使用bash内置“类型”的人获得准确的答案
。– Sajuuk,

Answers:


21

在这种情况下type,它与内置的bash无关type,但以后会更多。

关于“类型”的一些知识

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

$ type type
type is a shell builtin

语法为:

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

如果我们看一下timekillcat作为一个例子:

$ 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_cmdtime则使用bash内置函数。要使用该系统,time您可以做/usr/bin/time some_cmd

确保使用系统命令而非内置命令的一种常用方法是使用which

tt=$(which time)

然后用于$tt调用system time


有问题的命令

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

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

还有更多,请检查man find其余部分。

要搜索特定选项,您可以执行以下操作:

/ ^ \ s *-类型Enter

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


关于shell命令的一些知识

这有点个人解释。

在这种特定情况下,值得一提的是命令,选项,参数和管道。

这在某种程度上是松散使用的,但是在我的词汇中,我们简短地说:

  • 命令:程序内置
  • 参数:命令字后的实体。
  • option:一个可选参数。
  • 参数:必填参数。

在命令规范中,方括号用于指定选项,并且可选地,小于/大于则用于指定参数。从而:

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

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

这不是确切的规范,经常manhelp需要确定。

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

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,但some_command {} \;部分被扩大,内findsome_command string_of_found_entity


进一步

  • 报价
  • 扩张
  • 命令替换
  • 还有更多

您可能会发现这很有用


非常翔实。
Fredrick Gauss

8

你建议立即进行删除在看man find,而不是help typeman bashtypefind将指定哪些文件类型,您需要:

   -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


0

您查看了错误的手册页,这不是type -f命令,而是find -type f选项完全不同,请查看find手册以获取适当的说明。


0

-type f告诉find只打印f类型的文件,即普通文件,而不是目录,符号链接和设备文件。man find然后搜索-f选项。


0

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

man find

这会告诉你,与-type f-type谓词仅选择常规文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.