背景
虽然zsh 文档(第 6.2 章)提供了关于precommand 修饰符可以做什么的描述,但它没有提供每种类型的示例:-
、builtin
、command
、exec
、nocorrect
和noglob
.
用户Tuyen Pham也提出了类似的问题。但是,该问题并未强调为每种类型的前置命令修饰符请求示例。
问题
任何人都可以提供每个前置命令修饰符可以做什么的例子吗?
干杯!
虽然zsh 文档(第 6.2 章)提供了关于precommand 修饰符可以做什么的描述,但它没有提供每种类型的示例:-
、builtin
、command
、exec
、nocorrect
和noglob
.
用户Tuyen Pham也提出了类似的问题。但是,该问题并未强调为每种类型的前置命令修饰符请求示例。
任何人都可以提供每个前置命令修饰符可以做什么的例子吗?
干杯!
请注意,我在下面为每个修饰符提供了一个示例。除了这里显示的内容之外,还有一些,比如
exec
andcommand
,还有多种用途。用于运行实用程序将
-
插入破折号作为其第零个参数(命令名称)的第一个字符。作为命令名称的第一个字符的破折号是向 shell 发出信号表明它应该初始化为登录 shell 的常用方法。这可能会使您启动的 shell 读取一组不同的启动脚本。例如,在 的情况下
yash
,它将首先读取~/.yash_profile
文件,否则它不会这样做。当 shell 以
-
的第一个字符开头时$0
,它将是一个登录 shell。登录 shell 通常也会有一个l
(小写的 ell)$-
(尽管bash
shell 似乎不遵循这个习惯):使用
builtin
,您可以确保您运行的命令是命令的内置变体,而不是外部命令、别名或 shell 函数:例如,如果您想要编写一个名为的 shell 函数,这可能会很有用,作为它所做工作的一部分,称为实际更改工作目录
cd
的内置变体。cd
使用 justcd
会导致对您的函数的递归调用。该
command
命令是一个标准的 POSIX 命令,例如,可用于确定特定实用程序是否存在于用户当前的系统中PATH
:该
command
命令通常还用于禁用给定实用程序的别名和函数查找,其方式类似于我在builtin
上面展示的方式。exec
关键字也是 standard,可用于将当前 shell 完全替换为另一个进程:在此之后键入
exit
不会带您回到原来的 shell 会话,因为它已被bash
shell 会话所取代。您还可以使用
exec
为当前 shell 的标准 I/O 流设置重定向。如果当前交互式 shell 会话启用了拼写更正 (
setopt CORRECT
),则使用nocorrect
不会启用该命令的更正。按说:
与
nocorrect
:noglob
修饰符禁用当前命令的通配符:如果没有
noglob
修饰符,*
模式将被扩展,并且生成的单词(当前目录中的文件名)将作为echo
.在其他 shell 中,可以使用 暂时关闭 globbing
set -f
,然后使用 再次打开它set +f
。这将是在 shell 中禁用文件名通配的标准方法。该set -f
命令不影响 globbingzsh
,除非 shell 正在模拟sh
或ksh
。