如何知道运行脚本时使用了什么SHELL?

如何知道运行脚本时使用了什么SHELL?

如何输出执行脚本所使用的 shell?

例如:$SHELL 变量给出了给定用户的默认 shell。没关系,但给定用户可以使用其他 shell 启动脚本,例如:“sh script.sh”或“csh script.sh”。

使用Linux机器。

答案1

由于您指定了 Linux,因此可以使用readlink -f /proc/$$/exe.这将为您提供(在标准输出上)执行 shell 脚本的 shell 的路径(类似于/bin/bash)。所以你可以将它分配给一个变量(至少在 POSIX shell 中)var=$(readlink -f /proc/$$/exe)

$$是当前shell的pid;/proc/«pid»/exe是一个内核功能,可让您以某种“神奇”符号链接的形式查询在给定 pid 中运行的可执行文件。所以你可以使用readlink来获取路径。

在非 Linux 上,您应该能够使用ps,eg,ps -o args= $$但这可能最终会为您提供脚本名称(POSIX 允许这两种行为)。

除非您的脚本被设计为用于例如在用户的 shell 中设置变量,否则您确实应该使用#!顶部的一行来指定在哪个 shell 下运行它。

答案2

单独的脚本不应该测试它正在运行的解释器。这种自省很尴尬并且容易出错,并且可能必须针对不同的 Unice 以不同的方式实现。

例如,Perl 脚本始终可以安全地假定它正在由 Perl 解释器解释,Python 脚本始终由 Python 解释器运行,等等。那么,为什么脚本不应该bash假设它正在由 运行bash,并且sh脚本也正在由 运行呢/bin/sh

测试具体能力当前解释器的问题是一个不同的问题,例如bash提供$BASH_VERSION$BASH_VERSINFO测试版本的数组(例如)。

那么如何才能让一个bash脚本被运行bash,一个csh脚本被运行呢csh?好吧,您可以避免让用户选择解释器。

你可以这样做

  • 不要在脚本文件上添加文件名后缀,以防用户“困惑”。文件bash中的脚本可能myscript.sh会让用户认为它可以使用sh.相反,只需调用脚本myscript,然后...

  • 使用#!(“shebang”或“hashbang”)行。

-line#!位于脚本的第一行(这两个字符#!必须是文件中的第一个),并指定要使用的解释器的路径。

一个bash脚本可能有

#!/bin/bash

bash如果这是您系统上可执行文件的路径,或者如果您想从它位于系统上的bash任何位置获取它,$PATH

#!/usr/bin/env bash

例如,作为第一行。

这确保了它总是被bash或不被shcshpython或其他一些不相关的语言解释器解释。

下一步是

  • 使用 使脚本可执行chmod +x myscript

现在你可以运行你的脚本

./myscript

不用担心使用什么解释器来执行它。事实上,对于脚本的用户来说,这并不重要根本不无论是bash脚本、Python 脚本还是编译后的二进制文件。

相关内容