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


10

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

用例:我正在为脚本设置脚本,该脚本为命令设置别名,并且此别名是在Shell脚本中设置的。

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

脚本中有一种逻辑,它试图找到执行脚本的用户的默认外壳并将此别名添加到各自的〜/ .bashrc或〜/ .zshrc文件中

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

有没有一种方法可以获取执行脚本的shell类型,而与shebang设置无关?

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


@StephenRauch我应该早些提到它,我正在寻找一种适用于Mac和Linux系统的方法。在Mac上,/ etc / passwd不包含用户信息,仅在单用户模式下进行查询。
Spaniard89年

/etc/passwdOSX 上有什么?我在网上快速浏览了一下,似乎那里有外壳,只是没有用户名。用户ID仍然存在,为什么不使用它呢?
terdon

我想知道是否有可能列出详尽的shell。还是所有的Shell启动文件都始终符合。{name_of_shell} rc?
jamesqf

Answers:


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

谢谢,它就像一个魅力!这是唯一适用于基于Mac和Linux的Bistro的解决方案。
Spaniard89

1
顺便说一句,我稍微编辑了一下命令以使它对所有操作系统均不可知,finger $USER | grep 'Shell:*' | cut -f3 -d ":"因为Mac上不支持grep选项-P。
Spaniard89年

2
请注意,finger可能未在所有机器上都安装。它是基于RedHat的系统上的可选软件包。
史蒂芬·哈里斯

1
@Kishorepandey:getent|grep ^$USER:|cut -f: -f7如果默认情况下未安装手指,则可以使用代替手指。
Ipor Sircer

@Kishorepandey不要这样做。使用SHELL环境变量(如果存在)。查看用户数据库将为您提供结果(用户的登录shell),但可能不是正确的结果(用户最喜欢的交互式shell),这取决于用户的配置。
吉尔斯(Gillles)“所以-别再邪恶了”

19

环境变量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}'

3
getent passwd foobar跳过必须匹配特定行的操作。
库沙兰丹

感谢您的回答。我应该早些提到它,我正在寻找一种适用于Mac和Linux系统的方法。在Mac上,/ etc / passwd不包含用户信息,仅在单用户模式下进行查询。
Spaniard89年

4

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

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

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

2

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

echo $SHELL

但不是这样的:

echo $0

后者只会告诉您脚本当前正在使用哪个shell。因此,您需要上面的第一个选项。



0

也许这样:

   grep $USER </etc/passwd | cut -f 7 -d ":"

这对任何已经给出的答案都没有改善。
库萨兰达

如果有多个共同的作品用户,这将不起作用;例如,如果USER=fred那么这将匹配fredfrederickalfredalfredo...
斯蒂芬·哈里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.