gpt4 book ai didi

bash - 如何 : Detect bash from shell script

转载 作者:行者123 更新时间:2023-11-29 08:51:54 25 4
gpt4 key购买 nike

场景是要求用户获取脚本文件:

$ source envsetup.sh

此脚本文件可能仅使用 bash 功能,因此我们检测到正在运行的 shell 是否为 bash。

对于与 bash 共享通用语法的其他 shell,例如 sh、zsh、ksh,我想报告一个警告。

在 Linux、Cygwin、OS X 上检测当前 shell 的最可靠方法是什么?

我知道的是 $BASH,但我想知道它失败的可能性。

最佳答案

有许多环境变量可供您查看,但其中许多无法检测是否从 bash 生成了不同的 shell。请考虑以下事项:

bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: -bash, PS1: bash$ , prompt:

bash$ csh
[lorien:~] daveshawley% echo "SHELL: $SHELL, shell: $shell, \$0: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: /bin/tcsh, ARGV[0]: csh, PS1: bash$ , prompt: [%m:%c3] %n%#

[lorien:~] daveshawley% bash -r
bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: sh, PS1: bash$ , prompt:

bash$ zsh
% echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: zsh, PS1: % , prompt: %

% ksh
$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: ksh, PS1: bash$ , prompt:

有许多特定于各种 shell 的变量,除了它们有被子 shell 继承的习惯,这是环境问题真正破坏的地方。唯一几乎可以工作的是 ps -o command -p $$。这在技术上为您提供了 shell 运行的命令名称。在大多数情况下,这会起作用...因为应用程序是从 exec 系统调用的某些变体开始的,并且它允许命令的名称和可执行文件不同,所以这可能会失败以及。考虑:

bash$ exec -a "-csh" bash
bash$ echo "$0, $SHELL, $BASH"
-csh, /bin/bash, /bin/bash
bash$ ps -o command -p $$
COMMAND
-csh
bash$

另一个技巧是使用 lsof -p $$ | awk '(NR==2) {print $1}'。如果您有幸手边有 lsof,这可能是您所能得到的最接近的结果。

关于bash - 如何 : Detect bash from shell script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3199893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com