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

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

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

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

!# /bin/bash
alias = 'some command to set the alias'

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

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

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

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

答案1

环境变量SHELL总是扩展到默认的登录 shell调用用户的(从 获取值/etc/passwd)。

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

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

替换foobar为实际用户名。

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

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

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

getent passwd foobar | awk -F: '{print $NF}'

答案2

$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

答案3

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

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

perl -e '@x=getpwuid($<); print $x[8]'

答案4

您可以从环境中获取用户的默认 shell,如下所示:

echo $SHELL

但不是这样的:

echo $0

后者只会告诉您脚本当前使用的 shell。所以你想要上面的第一个选项。

相关内容