我在做什么?

kch*_*kch 41 unix shell

是否有命令来识别当前shell的名称/类型,shell二进制文件的路径以及shell的版本?

我不需要所有这些,但我能得到的越多越好.

我想要的东西,有相同的感觉uname,pwd,whoami.只是一个简单输出的普通实用程序.(到目前为止还没有出现:/)

回覆 ps

$ ps -o comm $$
COMM
-bash
Run Code Online (Sandbox Code Playgroud)

为什么-bash不像其他一切那样完整的路径呢?与那里的破折号有什么关系?

Mal*_*ala 55

当前运行的shell的命令或路径存储在环境变量中$0.要查看其价值,请使用:

echo $0
Run Code Online (Sandbox Code Playgroud)

这将输出您当前运行的shell 当前运行的shell 的路径,具体取决于它的调用方式.可能需要一些处理:

prompt:~$ echo $0
/bin/bash
prompt:~$ sh
sh-4.0$ echo $0
sh
sh-4.0$ exit
exit
prompt:~$ /bin/sh
sh-4.0$ echo $0
/bin/sh
sh-4.0$
Run Code Online (Sandbox Code Playgroud)

$SHELL环境变量包含用户的首选外壳,不一定是当前运行的外壳.

  • 好吧,从技术上讲,$ 0为您提供了执行程序的程序决定传递给系统调用程序的exec系列.例如,在登录shell上尝试它,你可能会看到`-bash` - 前面带有`-`. (6认同)

der*_*ert 7

如果您没有在shebang行中指定程序,我相信将使用/ bin/sh.不幸的是,我不相信有一种很好的可移植方式来确定那个shell是什么.

如果你在Linux上,你可以通过/proc以下方式找到可执行路径:

$ readlink "/proc/$$/exe"
/bin/dash
Run Code Online (Sandbox Code Playgroud)

并获得可执行文件名称很容易ps $$.

但这对shell的类型(除了通过已知shell的查找表)和版本(AFAICT,甚至没有办法从破折号获取版本)都无法帮助你

  • 嗯,你可以使用`lsof -p $$`并寻找第一个`txt`条目,这似乎是在我的Mac上做的......但哇是那么脆弱. (2认同)
  • 如果未指定解释器,则将使用当前运行的shell而不是/ bin/sh.(这就是为什么使用csh作为登录shell并编写没有shabang的脚本的人属于地狱的第4圈.) (2认同)

dim*_*mba 5

尝试($$是shell变量设置为处理shell的id):

ps -ef | grep $$
Run Code Online (Sandbox Code Playgroud)

或尝试这个(/ proc/self是shell的aloso进程id):

ps -ef | grep /proc/self
Run Code Online (Sandbox Code Playgroud)

关于"-bash" - 破折号意味着它的登录shell.再次键入bash,现在你会看到shell只是"bash"(没有破折号)

  • Sane的方法是:`ps $$` (3认同)

kch*_*kch -2

我想要有同样感觉的东西uname,,pwdwhoami只是一个具有简单输出的普通实用程序。

所以显然结论是我想要的工具不存在,并且没有简单的跨平台方法来解决这个问题。

这里的一些答案在 Linux 上工作得很好。