我不小心/实验性地-在zsh会话中输入了 a 并按了回车键。什么都没发生。
% -
% -
% echo $?
0
Run Code Online (Sandbox Code Playgroud)
通常的方法并没有告诉我它是什么:
% which -
% where -
%
Run Code Online (Sandbox Code Playgroud)
这是做什么的,它是在哪里定义的?
在 中bash,我收到了预期的错误:
%# -
bash: -: command not found
Run Code Online (Sandbox Code Playgroud)
它似乎不像是一个棘手的可执行文件[:
% ls /bin
[* dash* expr* ln* pwd* stty* zsh*
bash* date* hostname* ls* realpath* sync*
cat* dd* kill* mkdir* rm* tcsh*
chmod* df* ksh* mv* rmdir* test*
cp* echo* launchctl* pax* sh* unlink*
csh* ed* link* ps* sleep* wait4path*
Run Code Online (Sandbox Code Playgroud)
Gai*_*owl 17
这就是zsh所谓的“前置命令修饰符”。来自文档:
- The command is executed with a \xe2\x80\x98-\xe2\x80\x99 prepended to its argv[0] string.\nRun Code Online (Sandbox Code Playgroud)\n还有一些其他预命令修饰符,例如noglob和builtin。这是针对一个非常具体的用例,其中一些 shell 在被调用为-bash或-ksh或类似的东西时将充当登录 shell:
bash -c \'echo $0\'\n# => bash\n- bash -c \'echo $0\'\n# => -bash\nRun Code Online (Sandbox Code Playgroud)\n通过破折号,shell 通常会加载一些不同的启动文件。除了这种用法之外,-修饰符实际上并没有做太多事情 - 特别是,-在命令行上它本身只会修改一个空命令。该空命令可能会触发一些钩子函数,但不会做太多其他事情。