我在做什么?

时间:2009-08-15 09:45:36

标签: unix shell

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

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

我想要的内容与unamepwdwhoami具有相同的感觉。只是一个简单输出的普通实用程序。 (到目前为止还没有出现:/)

re ps

$ ps -o comm $$
COMM
-bash

为什么-bash而不是其他所有内容的完整路径?与那里的破折号有什么关系?

8 个答案:

答案 0 :(得分:55)

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

echo $0

这将输出当前正在运行的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$

$SHELL环境变量包含用户首选的shell,不一定是当前正在运行的shell。

答案 1 :(得分:7)

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

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

$ readlink "/proc/$$/exe"
/bin/dash

并通过ps $$轻松获取可执行文件名称。

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

答案 2 :(得分:5)

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

ps -ef | grep $$

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

ps -ef | grep /proc/self

关于“-bash” - dash表示它是登录shell。再次键入bash,现在您将看到shell只是“bash”(没有破折号)

答案 3 :(得分:2)

我认为'手指'是你正在寻找的合适人选。 试试这个命令:

finger `whoami`

答案 4 :(得分:1)

不是试图确定当前使用的shell,而是简单地重新执行所需的shell通常更合适。这可能只是一个历史性的解决方法,即没有可靠,可移植的方法来确定您当前使用的shell。最好的办法是编写脚本以尽可能多地使用shell,这样就不会出现问题。 (例如,可移植性很重要,无论有多少人想声称“bash无处不在”)

答案 5 :(得分:0)

您可以在Arch Linux中使用以下内容。

echo $SHELL

答案 6 :(得分:-1)

  

我想要的内容与unamepwdwhoami具有相同的感觉。只是一个简单输出的普通实用程序。

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

这里的一些答案在Linux上运行良好。

答案 7 :(得分:-1)

这显示了我更可靠的结果。

ls -la /bin/sh