zshでスクリプトを使用するとエラーが発生しますが、エラーはstderrの代わりにプロンプトに小さな赤いxを返します。 Bashでスクリプトを使用すると、エラーは返されず、期待どおりに動作します。 OMZなどを使用せず、最も基本的なzshのみを使用します。
どこを見るべきかを知るために、zshでエラーを印刷する方法はありますか?
私はこれが私がインストールしたソフトウェアとzshに関連するすべてとは関係がないと思います。しかし、私はどこから探すべきかさえ知りません。興味のある方は、より多くの背景情報をご覧いただけます。
私はコンピュータ流体力学(CFD)シミュレーションで一般的に使用されるソフトウェアパッケージをインストールしました。オープンバブル。 OpenFOAMはさまざまなバージョンを使用できるプロジェクトであり、異なるバージョンを同時にロードすると名前空間の競合が発生する可能性があるため、エイリアスを使用して単一のバージョンをシェルパスにロードするのが一般的です。たとえば、私の.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互換シェルで使用できます。
#すべてのPOSIX準拠シェル(例:ksh)で利用可能である必要があります。
OpenFOAMのこのセクションのスクリプトは、単にCシェルスクリプトとPOSIX互換シェルスクリプトの2つの部分に分かれています。この特定のスクリプトは、、、およびif
を[
除いてexport
ほとんど実行されず、unset
Bourne Againシェル機能のために困難を経験しません。
簡単な事実は質問です。間違って状態
私は最も基本的なzshを使用します
実際、質問者は明らかにPROMPT
最後のコマンドの終了状態がゼロでない場合(例:これは電力線のテーマから取ったものです。)。確かにこれはスクリプトの最後のコマンドは次のようになるため、この特定のスクリプトではゼロではありません。
[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion
これにより、Z シェルでゼロ以外のスクリプト終了ステータスが生成され、質問者のプロンプトに赤い文字が表示されます。皮肉なことに、このチェックは、スクリプトがKornシェルとZシェルでシームレスに実行されることを確認するために行われます。実際、赤十字と終了状態は純粋に外観上の問題です。
プロンプトでPowerline関連のロケール非標準のUnicode文字を使用することは、これがここで実行される一般的なZシェルプロンプトではないことを示します。
追加読書
- スティーブン(2017-07-27)。 5.0でkshシェルを使用してbashrcを取得する。バグ 2636. OpenFOAM 財団。
- ヘンリーウェラー(2017-07-27)。etc/bashrc: ksh および zsh をサポートするように更新されました。。 OpenFOAM/OpenFOAM-5.x。 GitHub。
- なぜ私のメッセージにこのようなクールな文字が表示されないのですか?
答え2
zsh
2つの異なる言語の通訳者である場合、について書いたコードを解釈できるとは期待できませんが、次のようにすることができます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