\ time,t / ime和cd实际做什么?(在外壳中加反斜杠的乐趣)


9

在讨论/usr/bin/time与内置shell(bash和zsh)之间的区别时time,有人提到一个人可以\time用作get的简写/usr/bin/time

首先,它似乎是一个不错的无害捷径,但随后出现了一些问题:

  • 为什么也可以t\ime工作?
  • 为什么\cd即使/usr/bin/cd¹都没有更改目录?

显然,\foo这不等于$(which foo)。现在的问题是:

\fooshell的POSIX定义是否以任何方式涵盖了bash和zsh中观察到的行为?如果是,为什么它表现得如此?


脚注1:/usr/bin/cd在我的系统上,

#!/bin/sh
builtin cd "$@"

另请参见unix.stackexchange.com/questions/12762/…。请注意,\ command是专门记录在案的tcsh功能,它表示忽略该命令的别名。
simpleuser

Answers:


14

t\ime或者\cd(或"tim"e'cd'${-##*}time${-+time}和报价,你可以想到的扩张最终会解析到的所有其他组合timecd)是:另一种方式来写cdtime

但是,这最终将解决cdtime在以后的shell语法解析和解释时解决。特别是,这在发生外壳关键字识别和别名替换之后很久就发生了。

因此,在外壳程序以其语言查找关键字时,它并没有被识别ti\metime外壳程序关键字。因此:

ti\me echo test

Shell会将其识别为简单命令,而不是time关键字后跟简单命令。

然后在报价ti\me会(这里反斜杠被引用的处理m,并不需要引用反正引用角色被删除,你会得到字符time)和time 命令将查到的像任何其他命令(在内建命令列表,中的函数和可执行文件$PATH。最有可能在/bin/time此处)

对于cdcdshell语言中没有关键字,只有cd内置命令(优先于your /usr/bin/cd)。但是,如果您确实定义了别名cd(如alias cd=pushd),请再次指定。由于别名替换是在替换引号之前很早完成的,如果您有一个别名cd而不是一个别名\cd(请注意,没有太多的shell允许在别名中使用反斜杠),则可以这样写:

\cd dir

您要确保cd别名没有被替换。

总之,引用了命令名或任何部分防止它被看作是一个外壳关键字(关键字是东西喜欢whileforif{... time是一个关键字一些只弹),并绕过你可能有它的别名。

但是,它不会强制该命令解析为中的可执行文件$PATH,该命令仍会首先在函数(可以通过执行此操作来解决command time cmd...)和内建函数(可以通过执行来解决env time cmd...,尽管我不知道)中进行搜索。具有内置time命令的外壳)。

请注意,报价也可以对特殊内建的行为的影响typeset/ declare/ export/ local...家庭在一些贝壳。请参见局部变量赋值是否需要引号?有关详细信息。


所以,差异之间time,并cd导致在观察到的行为不同的是,time是一个关键字cd一个内置命令
乔纳斯·谢弗

1
@JonasWielicki,它time是一个关键字,cd而不是。(如果您有cd或的别名time,那将是另一回事)。这cd是内置的还是没有内置的(就报价的影响而言)。但是,某些外壳程序具有一些内置关键字,它们位于关键字和内置关键字之间,因为它们的解析与其他内置关键字不同。是export/ typeset/ 的情况declare。我可能应该在此答案中添加一些说明。
斯特凡Chazelas
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.