追加読書

追加読書

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ほとんど実行されず、unsetBourne Againシェル機能のために困難を経験しません。

簡単な事実は質問です。間違って状態

私は最も基本的なzshを使用します

実際、質問者は明らかにPROMPT最後のコマンドの終了状態がゼロでない場合(例:これは電力線のテーマから取ったものです。)。確かにこれはスクリプトの最後のコマンドは次のようになるため、この特定のスクリプトではゼロではありません。

[ "$BASH" ] && . $WM_PROJECT_DIR/etc/config.sh/bash_completion

これにより、Z シェルでゼロ以外のスクリプト終了ステータスが生成され、質問者のプロンプトに赤い文字が表示されます。皮肉なことに、このチェックは、スクリプトがKornシェルとZシェルでシームレスに実行されることを確認するために行われます。実際、赤十字と終了状態は純粋に外観上の問題です。

プロンプトでPowerline関連のロケール非標準のUnicode文字を使用することは、これがここで実行される一般的なZシェルプロンプトではないことを示します。

追加読書

答え2

zsh2つの異なる言語の通訳者である場合、について書いたコードを解釈できるとは期待できませんが、次のようにすることができますbashzshbash

alias of5x="emulate bash -c 'source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc $FOAM_SETTINGS'"

このコマンドを実行するためにシミュレーションモードに入るzshために使用されます。bashsource

これはemulatezshと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

関連情報