SHELL="/bin/bash" 与 SHELL="bash"

SHELL="/bin/bash" 与 SHELL="bash"

导出 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/bashbash 一般来说

环境变量的目的SHELL是指向您要使用的 shell。各种软件都可以使用该变量(如果已设置)来尝试运行您选择的 shell,无论出于何种原因。您观察到的差异是因为某些程序依赖于PATH环境变量,有的则没有。

依赖的PATH工作原理如下。有一个字符串“编码”要运行的可执行文件。例如,字符串可能是/bin/bashfoo/bashbash。有两种情况:

  1. 如果字符串包含,/则字符串本身将被解释为可执行文件的绝对路径(例如/bin/bash)或相对路径(例如)。foo/bash
  2. 如果字符串不包含/(例如bash),则它仅指定可执行文件的基本名称。路径的其余部分(即目录组件)来自PATH。基本上,它是 中指定的第一个PATH包含具有指定基本名称的可执行文件的目录。根据PATHbash可以解析为/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,所以就使用这个。

相关内容