如何输出执行脚本所使用的 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
或不被sh
或csh
或python
或其他一些不相关的语言解释器解释。
下一步是
- 使用 使脚本可执行
chmod +x myscript
。
现在你可以运行你的脚本
./myscript
不用担心使用什么解释器来执行它。事实上,对于脚本的用户来说,这并不重要根本不无论是bash
脚本、Python 脚本还是编译后的二进制文件。