魚の文句をやめなさい:魚:$?終了状態ではありません。魚では$statusを使用してください。

魚の文句をやめなさい:魚:$?終了状態ではありません。魚では$statusを使用してください。

何も変更せずに、cshで実行する必要があるスクリプトを書いています。bashfish

これはすべてのシェルで正しい操作を行います。

perl -e '$bash=shift;$csh=shift;for(@ARGV){unlink;rmdir;}if($bash=~s/h//){exit$bash;}exit$csh;' "$?h" "$status" $PARALLEL_TMP
                                                                                      

文句に加えてfish

fish: $? is not the exit status. In fish, please use $status.

魚に知らせる互換性のある方法はありますか?警告しないでください。私は私が何をしているのか知っています。

ベストアンサー1

$ bash -c 'false; echo "[$status]" "[`echo \$?h`]"'
[] [1h]
$ csh -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [0]
$ fish -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [`echo $?h`]

`fishBourneなどのシェルが追加のレベルのバックスラッシュ処理を実行するという事実を活用するための特別なことはありません`...`

evalさらに、3つのシェルすべてでサポートされているものを使用できる必要があり、一部の環境変数で3つのシェルすべてに対して異なるコードを準備する必要があるため、操作が簡素化されます。

if ($csh || $fish) {
   ENV{CHECK_STATUS} = q{perl -e '...' $status};
} else {
   ENV{CHECK_STATUS} = q{perl -e '...' "$?"};
}
exec $shell, "-c", ...;

シェルコードは次のとおりですeval "$CHECK_STATUS"(forには改行文字を含めないでくださいcsh$CHECK_STATUS

おすすめ記事