在“找不到命令”错误的“ bash”之前加破折号“-”是什么意思?


28

当您在bash提示符下输入无效命令时,您会收到消息

-bash: {command}: command not found

什么是-在开始的时候意味着什么?


您究竟如何运行该命令?我试图复制,但我没有得到相同的结果-例如> jhgjbjbkjln: command not found-没有-bash: 在那里。您是否bash在Unix,Linux,OSX等平台上使用?我问,因为这可能是默认情况下放在错误消息之前的特定实现,但这并不意味着什么。
jimm-cl 2014年

@jim尝试使用ssh computername您的not count命令进行复制。
2014年

Answers:


27

这意味着它是一个登录shell。

来自man bash

登录外壳是一个参数为零的第一个字符为-的外壳程序,或以--login选项开头的外壳程序。

(在bash术语中,“ zeroth”自变量是命令名称,在您的情况下为bash。)bash将此信号用作执行登录活动(例如execute .bash_profile等) 的信号。

可以自动添加破折号的一种方法是,如果外壳以开头exec。从Bash手册

exec [-cl] [-a name] [command [arguments]]

[...]如果-l提供了该选项,则shell在传递给command的第零个参数的开头放置一个破折号。

比较这两次尝试运行命令的尝试nonexistent。首先没有-l

$ exec bash
$ nonexistent
bash: nonexistent: command not found

其次,具有:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found

3
我认为您引用的文档部分与您的解释不符。exec -l加上破折号的事实是可能导致bash运行为的一种可能方式-bash,但其本身并不能说明它是登录shell,而且很有可能根本没有使用OP exec -l。 。文档中将-bash其设为登录shell的部分是“ INVOCATION登录shell是其参数为零的第一个字符为-或以--login选项开头的登录shell。”
2014年

@hvd,同意。虽然正确,但这个答案没有讲到重点。
斯特凡Chazelas

1
“第零个参数”不是bash术语,而是Unix约定+ C索引:每个程序都会传递一个参数列表,其初始输入是程序名称,后跟参数。由于C数组索引从0开始的参数零(即,零参数)是程序名称,和实际的参数启动与索引1
celtschk

15

另一个答案就目前而言还不错,但是值得一提的是该功能比bash更通用。

从远古时代开始,该login程序就argv[0]在执行用户外壳程序时加了一个破折号,并且该外壳程序已将其识别为它应充当“登录外壳程序”的标志。它在V7手册页中进行了记录:login(1)sh(1)

提供类似登录名的服务(对用户进行身份验证并运行shell)的所有程序都应遵循“前缀破折号”规则。例如,您可以在ssh / session.c中的以下注释中看到sshd的作用:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

所有外壳都可以识别前划线。-l在经典的Bourne shell或原始csh中不存在等效选项,但是大多数较新的shell(bash,dash,ksh,yash,tcsh,zsh,rc,es,fish和csh的任何最新版本)都具有此选项。


2
即使现在大多数shell都具有该-l选项,login但仍不使用它。所有外壳程序都应将前缀识别argv[0]为“官方”机制。
Barmar 2014年
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.