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)
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Run Code Online (Sandbox Code Playgroud)
由于getent不是 MacOS 上的标准命令,您可能希望使用较低级别的getpwuid调用来查询机器配置的命名服务。这可能需要调用perlor python,这在大多数类 Unix 平台上都很常见
例如,这将返回当前用户的外壳:
perl -e '@x=getpwuid($<); print $x[8]'
Run Code Online (Sandbox Code Playgroud)