导出 SHELL="/bin/bash" 和 SHELL="bash" 有什么区别?我以前export SHELL="bash"
在我的 .bashrc 中有过。它似乎奏效了。$($SHELL) 产生了一个子shell,但是使用公钥认证的 ssh 给出了错误:Shell "bash" is not executable: No such file or directory
$($SHELL)
产生了一个子shell
是的,因为在外壳$SHELL
(或更好 "$SHELL"
)中扩展到/bin/bash
或bash
在您的情况下,两者都会产生 Bash。
旁注:当您使用 时$($SHELL)
,来自新 shell 的输出将在 shell 退出后执行,因为这是命令替换 ( $( … )
) 的工作方式。命令替换在这里没有多大意义,不需要表明您的观点。
你的观点似乎是:时SHELL="bash"
,"$SHELL"
运行猛砸,一些其它工具(SSH服务器?)抱怨。
目前尚不清楚什么工具会抱怨。并且您没有告诉我们是否SHELL
在客户端或服务器端被篡改。问题中没有mcve。也不清楚为什么需要SHELL
在.bashrc
. 我不会调查这些。
我要告诉你SHELL
之间的区别/bin/bash
与bash
一般。
SHELL
环境变量的目的是指向你要使用的shell。无论出于何种原因,各种软件都可以使用该变量(如果已设置)来尝试运行您选择的 shell。您观察到的差异是因为有些程序依赖于PATH
环境变量,有些则不依赖。
对PATH
工作的依赖如下。有一个字符串“编码”要运行的可执行文件。例如,字符串可能是/bin/bash
,foo/bash
或bash
。有两种情况:
/
则字符串本身被解释为可执行文件的绝对路径(例如/bin/bash
)或相对路径(例如foo/bash
)。/
(eg bash
) 那么它只指定可执行文件的基本名称。路径的其余部分(即目录组件)来自PATH
. 基本上它是指定的第一个目录,PATH
其中包含具有指定基本名称的可执行文件。根据PATH
,bash
可以解析为/bin/bash
, /home/you/bin/bash
, ./bash
(很少)或根本不解析(给您command not found
或类似的错误)。外壳依赖于PATH
,因此在外壳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"
. 即使您是这个意思,最好使用带有 的路径/
,因此PATH
可以使用的 shell 中的机制不会干扰SHELL
应如何解释。
很可能你不想要./bash
. 你想/bin/bash
所以使用这个。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句