导出 SHELL="/bin/bash" 和 SHELL="bash" 有什么区别?我之前export SHELL="bash"
在 .bashrc 中有过。它似乎有效。$($SHELL) 生成了一个子 shell,但使用公钥身份验证的 ssh 给出了错误:Shell "bash" is not executable: No such file or directory
答案1
$($SHELL)
生成一个子 shell
是的,因为在 shell 中$SHELL
(或更好的 "$SHELL"
) 扩展为/bin/bash
,或者bash
在您的情况下,同时生成 Bash。
附注:使用 时$($SHELL)
,来自新 shell 的输出将在 shell 退出后执行,因为这是命令替换 ( $( … )
) 的工作方式。命令替换没什么意义这里不需要展示你的观点。
你的观点似乎是:当SHELL="bash"
运行"$SHELL"
Bash 时,其他一些工具(SSH 服务器?)会抱怨。
不清楚哪个工具会抱怨。而且你没有告诉我们是SHELL
在客户端还是在服务器端被篡改。没有麦克韦在问题中。还不清楚为什么你需要设置SHELL
。.bashrc
我不会调查这些。
我将告诉你和SHELL
之间的区别/bin/bash
bash
一般来说。
环境变量的目的SHELL
是指向您要使用的 shell。各种软件都可以使用该变量(如果已设置)来尝试运行您选择的 shell,无论出于何种原因。您观察到的差异是因为某些程序依赖于PATH
环境变量,有的则没有。
依赖的PATH
工作原理如下。有一个字符串“编码”要运行的可执行文件。例如,字符串可能是/bin/bash
,foo/bash
或bash
。有两种情况:
- 如果字符串包含,
/
则字符串本身将被解释为可执行文件的绝对路径(例如/bin/bash
)或相对路径(例如)。foo/bash
- 如果字符串不包含
/
(例如bash
),则它仅指定可执行文件的基本名称。路径的其余部分(即目录组件)来自PATH
。基本上,它是 中指定的第一个PATH
包含具有指定基本名称的可执行文件的目录。根据PATH
,bash
可以解析为/bin/bash
、/home/you/bin/bash
、./bash
(很少)或者根本没有(给出command not found
或类似的错误)。
Shell 依赖于PATH
,因此在 shell 中bash
(逐字输入或从 或任何其他的扩展中出现$SHELL
)会找到/bin/bash
或/some/other/path/to/bash
在合理配置的系统中。
不依赖于 的工具PATH
将字符串视为路径(路径名)。对于包含 的字符串,这没有区别/
。对于不包含 的字符串,这有很大区别/
。如果字符串是bash
并且直接将其解释为路径,则相当于 ,表示“当前工作目录中./bash
命名的文件”。bash
无论是什么导致了错误,显然都检索了SHELL
变量的内容并将其用作路径,而不依赖于PATH
变量。
这是正确的做法。注意 POSIX指定SHELL
作为:
该变量应代表用户首选的命令语言解释器的路径名。
调查 ”路径名“ 和 ”路径名解析",这些不依赖于PATH
。任何使用变量的工具SHELL
都应将其内容直接视为路径名。
当SHELL="bash"
在 shell 中"$SHELL"
运行 Bash 时,仅因为$SHELL
扩展像任何其他变量一样然后bash
治疗与任何其他不包含的命令一样/
. 所以这有点偶然。
如果我正确理解了 POSIX 文档,那么SHELL="bash"
只有当您的意思是 时才应该使用SHELL="./bash"
。即使您的意思是这样,最好使用带有 的路径/
,这样 shell 中可以使用 的机制PATH
不会干扰应如何SHELL
解释。
您很可能不想要./bash
。您想要/bin/bash
,所以就使用这个。