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

用户2453676

导出 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/bashbash在您的情况下,两者都会产生 Bash。

旁注:当您使用 时$($SHELL),来自新 shell 的输出将在 shell 退出后执行,因为这是命令替换 ( $( … )) 的工作方式。命令替换在这里没有多大意义,不需要表明您的观点。

你的观点似乎是:时SHELL="bash""$SHELL"运行猛砸,一些其它工具(SSH服务器?)抱怨。

目前尚不清楚什么工具会抱怨。并且您没有告诉我们是否SHELL在客户端或服务器端被篡改。问题中没有mcve也不清楚为什么需要SHELL.bashrc. 我不会调查这些。

我要告诉你SHELL之间的区别/bin/bashbash 一般

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

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

  1. 如果字符串包含,/则字符串本身被解释为可执行文件的绝对路径(例如/bin/bash)或相对路径(例如foo/bash)。
  2. 如果字符串不包含/(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章