如何判断我的shell运行我的init文件?

时间:2013-10-08 03:26:49

标签: bash shell config sh zsh

我有一个init文件(/etc/profile.d/which2.sh),它会在任何shell启动时将'which'命令别名。在bash或sh中很好,但在zsh中我不希望这是一个已经知道别名和函数的内置。如何在zsh下运行脚本并且不执行别名?

$ 0无济于事。

我已经通过在zsh特定的〜/ .zshrc中取消设置别名来解决问题,但我想知道另一种方法。

4 个答案:

答案 0 :(得分:3)

怎么样

[ "$(which which)" = /usr/bin/which ] && alias which "whichever"

这不会验证shell的名称;而是验证shell的行为。这是一个普遍适用的编程范例的实例:尽可能直接测试行为。 (例如,参见浏览器检测。)

在这种情况下,如果您只是将shell的名称检查为行为检查的代理,那么您现在可能会好运,但将来可能会出现问题。该名称实际上是任意的,可能很容易引入新名称。例如,某些发行版kshzsh的硬链接; zsh会调整其行为,以模仿ksh。另一个例子,我有两个不同的zsh版本,其中一个被调用为zsh5

理想情况下,测试不依赖于which实用程序的精确位置。

答案 1 :(得分:0)

SHELL环境变量包含shell二进制文件的完整路径。您可以使用它(或其基本名称):

s=$(basename $SHELL)
[ "$s" = 'zsh' ] || alias which="what you want it to be"

答案 2 :(得分:0)

@rici's approach最适合手头的情况,但是如果您确实需要知道当前正在执行的特定shell [可执行文件]

检查$0

的值
  • 它指向shell二进制为已调用,即该值可能只是文件名或路径。
  • 在OSX上,该值可能以-为前缀,即如果shell是登录 shell;例如,-bash

注意:请勿使用$SHELL,因为它仅在登录时设置一次 - 指向登录shell的路径。即使以后运行其他shell,它的值也不会改变。

因此,与POSIX兼容的获取当前shell的可执行文件 filename 的方法是:

basename -- "${0#-}"  # -> (e.g., in bash) 'bash'; will NOT work in csh/tcsh

示例:

currShell=$(basename -- "${0#-}")  # Store shell-binary filename in variable.

[ "$(basename -- "${0#-}")" = 'zsh' ] && echo "This is a ZSH shell."

如果仅测试特定的shell 就足够了,您可以只测试特定环境变量的存在,例如$BASH_VERSION$ZSH_VERSION

但请注意,并非所有炮弹都有这样的特征变量;例如,dash没有。

示例:

[ -n "$ZSH_VERSION" ] && echo "This is a ZSH shell."

答案 3 :(得分:0)

你在考试什么?在过去,当我们必须确定我们是在Kornshell还是Bournshell下运行时,我们可以进行以下测试:

if [ "$RANDOM" = "$RANDOM" ]
then
    echo "This is the Bourne shell"
    /bin/ksh $*   # Script needs the Kornshell
else
    echo "This is the Kornshell"
fi

当然,Kornshell和Bash都会扩展$RANDOM(zsh也是如此)......

好的......你可以通过这种方式找到当前tty上运行的进程:

ps -ft $(tty)

一点格式化:

$ ps -ocommand="" -t$(tty)  
login -pf david
-ksh
bash

非常好。贝壳以sh结尾,所以我会做出这个假设。我只想要以sh结尾的行:

$ ps -ocommand="" -t$(tty)  | grep "sh$"
-ksh
bash

是的,我在这个TTY中运行了两个shell。我用Kornshell登录,然后炮击bash。让我们在混合中抛出PID:

$ ps -t$(tty) -opid="" -ocommand="" | grep "sh$"
62599 -ksh
62855 bash

我们想要具有最高PID

的那个
$ ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1
62983 bash
是的,我正在运行Bash。让我们摆脱PID:

$  ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1 | sed 's/.* //'
bash

让我们看看它是否适用于各种shell:

$ ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1 | sed 's/.* //'
ksh

Kornshell很好。

$ ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1 | sed 's/.* //'
zsh

适用于zsh

$ ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1 | sed 's/.* //'
sh

使用Dash或Ash

% ps -t$(tty) -opid="" -ocommand="" | grep "sh$" | sort -k1,1nr | head -1 | sed 's/.* //'
Illegal variable name.

在tcsh中不起作用。哦,好吧......你不能取悦所有人。