在 shell 脚本中找出用户的默认 shell

Spa*_*d89 19 shell configuration

我想知道是否有办法在 shell 脚本中找出当前用户的默认 shell?

用例:我正在编写一个为命令设置别名的脚本,这个别名是在 shell 脚本中设置的。

!# /bin/bash
alias = 'some command to set the alias'
Run Code Online (Sandbox Code Playgroud)

脚本中有一个逻辑,它尝试查找执行脚本的用户的默认 shell 并将此别名添加到相应的 ~/.bashrc 或 ~/.zshrc 文件中

但是当我在脚本前面添加一个shebang并明确要求它使用bash时,这里发布的答案总是按预期返回bash,尽管我是在ZSH终端上执行这个脚本的。

有没有办法获取执行脚本的 shell 类型,而不管 shebang 设置如何?

我正在寻找一种适用于 Mac 和所有基于 linux 的小酒馆的解决方案。

hee*_*ayl 23

环境变量SHELL将始终扩展为调用用户的默认登录 shell (从 中获取值/etc/passwd)。

对于任何其他给定用户,您需要使用 进行一些处理/etc/passwd,这是一个简单的awk片段:

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

替换foobar为实际用户名。

如果您有ldap(或类似的地方),请使用getent获取数据库而不是直接解析/etc/passwd

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'
Run Code Online (Sandbox Code Playgroud)

或者最干净的方法,让我们getent进行解析(感谢@Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

  • `getent passwd foobar` 跳过必须匹配特定行。 (4认同)

Ipo*_*cer 7

$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,我稍微编辑了该命令,使其对所有操作系统`finger $USER | 不可知。grep '外壳:*' | cut -f3 -d ":"` 因为 Mac 不支持 grep 选项 -P。 (3认同)
  • 请注意,并非所有机器上都安装了“finger”。它是基于 RedHat 的系统上的可选包。 (3认同)
  • @Kishorepandey:如果默认情况下未安装finger,您可以使用`getent|grep ^$USER:|cut -f: -f7` 代替finger。 (2认同)

Ste*_*ris 5

由于getent不是 MacOS 上的标准命令,您可能希望使用较低级别的getpwuid调用来查询机器配置的命名服务。这可能需要调用perlor python,这在大多数类 Unix 平台上都很常见

例如,这将返回当前用户的外壳:

perl -e '@x=getpwuid($<); print $x[8]'
Run Code Online (Sandbox Code Playgroud)