我在 zsh 中使用脚本时遇到错误,但该错误仅在提示符上返回一个小红色 x,而不是 stderr。在 bash 中使用该脚本不会返回任何错误并且按预期工作。我只使用最基本的 zsh,没有使用 OMZ 等。
有没有办法在 zsh 中输出错误,让我知道去哪里查找?
我认为这与我安装的软件无关,而是与 zsh 有关;但是,我什至不知道从哪里开始看。感兴趣的人可以了解更多背景信息:
我安装了一个常用于计算流体动力学 (CFD) 模拟的软件包,称为开放泡沫。 OpenFOAM 是一个具有许多不同可用版本的项目,由于同时加载不同版本会导致命名空间冲突,因此通常使用别名将单个版本加载到 shell 路径中。例如,我的.zshrc
文件包含以下几行:
alias of5x="source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc $FOAM_SETTINGS"
alias of4x="source $HOME/OpenFOAM/OpenFOAM-4.x/etc/bashrc $FOAM_SETTINGS"
alias of30x="source $HOME/OpenFOAM/OpenFOAM-3.0.x/etc/bashrc $FOAM_SETTINGS"
当我使用别名加载最新版本 ( ) 时,我的命令行上5x
会出现红色:x
答案1
所讨论的脚本可以从任何 POSIX 兼容的 shell 中使用,正如它本身所说:
# 应该可以被任何 POSIX 兼容的 shell(例如 ksh)使用
OpenFOAM 这部分中的脚本简单地分为两部分:C shell 脚本和符合 POSIX 的 shell 脚本。这个特定的脚本除了if
、[
、export
、 和之外几乎没有什么作用unset
,并且不存在 Bourne Again shell 特性的问题。
简单的事实是这个问题不正确地状态
我只是使用最基本的 zsh
事实上,提问者清楚地如果PROMPT
最后一个命令的退出状态非零(例如这个来自电力线主题)。当然这是对于这个特定脚本来说非零,因为脚本中的最后一个命令是:
[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion
这会在 Z shell 中产生非零的脚本退出状态,从而导致提问者的提示显示红色字符。讽刺的是,进行此检查是为了确保脚本能够在 Korn 和 Z shell 中顺利运行;确实如此,红十字会和退出状态纯粹是表面问题。
在提示符中使用电力线专用区域非标准 Unicode 字符表明这不是此处运行的普通 Z shell 提示符。
进一步阅读
- 斯蒂芬 (2017-07-27)。 在 5.0 中使用 ksh shell 获取 bashrc。 Bug 2636。OpenFOAM 基金会。
- 亨利·韦勒(2017-07-27)。etc/bashrc:更新以支持 ksh 和 zsh。 OpenFOAM/OpenFOAM-5.x。 GitHub。
- 为什么这些奇特的字符没有显示在我的提示中?
答案2
zsh
和bash
是两种不同语言的解释器,您不能期望zsh
能够解释为 编写的任何代码bash
,但是您可以这样做:
alias of5x="emulate bash -c 'source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc $FOAM_SETTINGS'"
用于zsh
进入bash
运行该source
命令的仿真模式。
这emulate
将减少但不会消除 zsh 和 bash 之间的差异。请注意,该源文件中声明的任何函数都将保留该模拟模式。
无论如何,bash 和 zsh 中提示变量的格式完全不同,因此我不希望专门为 bash 编写的脚本能够定义也适用于 zsh 的提示。
答案3
您可以更正该脚本,该脚本因错误而退出,如 JdeBP 的答案中所述:
添加true
到最后一行之后
[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion
true
或者另一种选择是将最后一行更改为
if [ "$BASH" ]; then . $WM_PROJECT_DIR/etc/config.sh/bash_completion; fi