我有一个init文件(/etc/profile.d/which2.sh),它会在任何shell启动时将'which'命令别名。在bash或sh中很好,但在zsh中我不希望这是一个已经知道别名和函数的内置。如何在zsh下运行脚本并且不执行别名?
$ 0无济于事。
我已经通过在zsh特定的〜/ .zshrc中取消设置别名来解决问题,但我想知道另一种方法。
答案 0 :(得分:3)
怎么样
[ "$(which which)" = /usr/bin/which ] && alias which "whichever"
这不会验证shell的名称;而是验证shell的行为。这是一个普遍适用的编程范例的实例:尽可能直接测试行为。 (例如,参见浏览器检测。)
在这种情况下,如果您只是将shell的名称检查为行为检查的代理,那么您现在可能会好运,但将来可能会出现问题。该名称实际上是任意的,可能很容易引入新名称。例如,某些发行版ksh
是zsh
的硬链接; 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是登录 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中不起作用。哦,好吧......你不能取悦所有人。