让 bash 使用外部 `time` 命令而不是内置的 shell

Dav*_*man 28 bash shell-builtin time-utility

如何让 bash 默认使用时间二进制文件 (/usr/bin/time) 而不是 shell 关键字?

which time返回/usr/bin/time
type time返回time is a shell keyword
运行time显然是在执行shell关键字:

$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
$ /usr/bin/time
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
   [--portability] [--format=format] [--output=file] [--version]
   [--quiet] [--help] command [arg...]
Run Code Online (Sandbox Code Playgroud)

enable -n time 返回 bash: enable: time: not a shell builtin

use*_*ser 33

您可以使用command内置的shell 来绕过正常的查找过程并将给定的命令作为外部命令运行,而不管任何其他可能性(shell 内置、别名等)。这通常在需要跨系统移植的脚本中完成,尽管可能更常使用速记\(如 in\rm而不是command rmrm,特别是后者可能被别名为未知的东西,例如rm -i)。

$ time

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 
Run Code Online (Sandbox Code Playgroud)

这可以与别名一起使用,如下所示:

$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
$ 
Run Code Online (Sandbox Code Playgroud)

与 eg 相比,这样做的优点alias time=/usr/bin/time是您没有指定time二进制文件的完整路径,而是退回到通常的路径搜索机制。

alias命令本身可以进入如〜/ .bashrc或者/etc/bash.bashrc(后者是全球性的系统上的所有用户)。

对于相反的情况(如果定义了别名,则强制使用内置的 shell),您可以使用类似builtin time,它再次覆盖通常的搜索过程并运行命名的 shell 内置。bash 手册页提到,这通常用于cd通过名为 的函数提供自定义功能,而该函数cd又使用内置函数cd来执行实际操作。

  • `command` 不会绕过内置函数(除非在不模拟其他 shell 的情况下在 `zsh` 中)。它绕过了函数,这是它存在的主要原因。它的第二个作用是删除 _special 内置函数_中的 _special_。它绕过别名和关键字只是因为它们只在第一个位置扩展(例如,在 `zsh` 中,它不会绕过全局别名)。没有内置`time` bash。`time` 是一个关键字,所以你可以做例如 `time { foo; 酒吧; }`。 (13认同)
  • 你答案的最后一部分是错误的。time 不是 shell 内置函数,而是 shell 关键字。`内置时间`不起作用。 (2认同)

Izk*_*ata 9

bash 中有一个绕过关键字的快捷方式,而不必指定路径或使用另一个内置函数,例如command:用反斜杠转义它。

=^_^= izkata@Izein:~$ time

real    0m0.000s
user    0m0.000s
sys     0m0.000s
=^_^= izkata@Izein:~$ \time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
Run Code Online (Sandbox Code Playgroud)

就个人而言,我觉得这更易读、更安全,因为这是可能的:

=^_^= izkata@Izein:~$ alias command=echo
=^_^= izkata@Izein:~$ command time
time
Run Code Online (Sandbox Code Playgroud)

  • 请注意,任何形式的引用或任何使其*不*标记`time`的形式都可以:`ti\me`、`'time'`、`ti""me`、`ti${-##*} me`、`${-+time}`... 这适用于任何 shell 关键字。 (8认同)
  • @maxywb 此外,它不仅仅是装饰性的 - 如果最后一个命令失败,快乐的脸就会变成红色的`(x_x)` (2认同)

小智 5

内置函数(例如测试)的一般解决方案是[1]

但时间并不是固有的。

该词time是“保留词”,不是命令,也不是内置词。启用此解决方案:

  • 引用这个词。这不适用于内置程序。
    引用作品的多种形式: \time "time" 'time' ti\me ti"me"等。

    $  time
    
    real    0m0.000s
    user    0m0.000s
    sys     0m0.000s
    
    $ \time
    Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
           [--portability] [--format=format] [--output=file] [--version]
           [--quiet] [--help] command [arg...]
    
    Run Code Online (Sandbox Code Playgroud)

    这对于绕过别名很有用。即使test有别名,\test也会执行 PATHed 命令(如果尚未禁用,则执行内置命令)。

  • 使用内置函数command(这不适用于内置函数):

    $ command time
    
    Run Code Online (Sandbox Code Playgroud)
  • 与上面的内置函数一样,使用任何斜杠都可以/

    $ /usr/bin/time
    
    Run Code Online (Sandbox Code Playgroud)
  • 与上面的内置函数一样,别名也可以在这里使用:

    $ alias time='command time'
    $ alias time='/usr/bin/time'
    
    Run Code Online (Sandbox Code Playgroud)

[1] 假设有一个外部可执行文件~/bin/test打印“外部测试”。更进一步:假设它在活动路径中~/bin位于前面。/bin