何も変更せずに、csh
で実行する必要があるスクリプトを書いています。bash
fish
これはすべてのシェルで正しい操作を行います。
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`]
`
fish
Bourneなどのシェルが追加のレベルのバックスラッシュ処理を実行するという事実を活用するための特別なことはありません`...`
。
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
。