Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 我在哪?_Unix_Shell - Fatal编程技术网

Unix 我在哪?

Unix 我在哪?,unix,shell,Unix,Shell,是否有一个命令来标识当前shell的名称/类型、shell二进制文件的路径以及shell的版本 我不需要所有这些,但我能得到的越多越好 我想要一个有着同样感觉的东西,uname,pwd,whoami。只是一个具有简单输出的普通实用程序。(到目前为止还没有出现:/) reps 为什么要使用-bash而不是完整路径,因为它与其他所有内容一样?破折号是怎么回事?当前运行的shell的命令或路径存储在环境变量$0中。要查看其值,请使用: echo $0 这将输出当前运行的shell或当前运行的shel

是否有一个命令来标识当前shell的名称/类型、shell二进制文件的路径以及shell的版本

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

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

re
ps

为什么要使用
-bash
而不是完整路径,因为它与其他所有内容一样?破折号是怎么回事?

当前运行的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。

Try($$是设置为SHELL进程id的SHELL变量):

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


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

如果不在shebang行中指定程序,我相信将使用/bin/sh。不幸的是,我不相信有一个好的便携式方法来确定外壳是什么

如果您使用的是Linux,您可以通过
/proc

$ readlink "/proc/$$/exe"
/bin/dash
通过
ps$$
获取可执行文件名很容易


但这对shell类型(除了通过已知shell的查找表)和版本(AFAICT,甚至没有从dash获取版本的方法)都没有帮助。

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

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

显然,结论是我想要的工具不存在,而且没有简单的跨平台方法来实现这一点


这里的一些答案在Linux上很有用。

我认为“finger”正是您要寻找的答案。 请尝试以下命令:

finger `whoami`

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

ls -la /bin/sh

您可以在ArchLinux中使用以下内容

echo $SHELL

因此,$0实际上为您提供了当前正在运行的脚本的名称。因此,在脚本中,它将为您提供脚本的名称,而不是解释脚本的shell的名称。从技术上讲,$0为您提供执行程序决定传递给exec系统调用系列的任何程序。例如,在登录shell上尝试它,您可能会看到前面有
-
-bash
。有趣的是这是一个
sh
(和
sh
类似)的东西。如果你的shell是说,
fish
它不工作。一个明智的方法是:
ps$$
是的,我同意这些是更精确的命令。这可能是对所有任务使用相同命令的“懒惰”习惯之一:)@kch:实际上,根据POSIX的说法,
-o comm
。出于某种原因,他们不得不将其缩写。但是它可能有与
$0
相同的问题。仅供参考,我使用的是OS X,而我们没有/proc.Hmm,您可以使用
lsof-p$$
并查找第一个
txt
条目,它似乎在我的Mac上运行。。。但是魔兽世界是如此脆弱。我对一个简单解决方案的追求到此为止。但到目前为止还是很有趣的。使用lsof远远不够。如果没有指定解释器,将使用当前运行的shell而不是/bin/sh(这就是为什么使用csh作为登录shell并编写没有沙邦的脚本的人属于地狱的第四圈。)
-bash
是因为它是一个登录shell。在下面的一个答案中,可以看到我对
$0
的评论。我开始认为我们在javascript for web中使用的“非浏览器功能测试”思想可能适用于这里。我总是喜欢用我自己的问题来回答一个问题:为什么你需要知道这一点?你打算如何使用这些信息以及为了什么目的?@wez just普遍的好奇心。目前我对它没有特别明显的需求。它的可能副本与首选的shell相呼应,而不是当前正在运行的shell。
finger `whoami`
ls -la /bin/sh
echo $SHELL