代码之家  ›  专栏  ›  技术社区  ›  kch

我在哪一层?

  •  41
  • kch  · 技术社区  · 15 年前

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

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

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

    重新 ps

    $ ps -o comm $$
    COMM
    -bash
    

    为什么? -bash 而不是像对待其他一切一样的完整路径?那破折号是怎么回事?

    8 回复  |  直到 7 年前
        1
  •  55
  •   Dave Jarvis aSterX    9 年前

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

    echo $0
    

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

        2
  •  7
  •   derobert    15 年前

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

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

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

    获取可执行文件名很容易 ps $$ .

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

        3
  •  5
  •   dimba    15 年前

    Try($$is shell变量设置为shell的进程ID):

    ps -ef | grep $$
    

    或者尝试此操作(/proc/self is aloso process id of the shell):

    ps -ef | grep /proc/self
    

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

        4
  •  2
  •   Jackie Yeh    13 年前

    我认为“手指”就是你要找的那个。 尝试此命令:

    finger `whoami`
    
        5
  •  1
  •   William Pursell    15 年前

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

        6
  •  0
  •   Upul Doluweera    7 年前

    您可以在ARCHLinux中使用以下内容。

    echo $SHELL
    
        7
  •  -1
  •   kch    15 年前

    我想要和你一样的感觉 uname , pwd , whoami .只是一个简单输出的普通实用程序。

    所以很明显,结论是我想要的工具不存在,并且没有简单的跨平台方法来实现这一点。

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

        8
  •  -1
  •   Arsen    7 年前

    这给我展示了更可靠的结果。

    ls -la /bin/sh