
私は Unix の初心者で、現在、ファイルが正常で読み取り可能かどうかをチェックするエイリアスを作成する必要があります。異常な場合は、終了コードとして 1 を返し、読み取り可能かどうかをテストする必要はありません。読み取り不可能な場合は、終了コードとして 2 を返す必要があります。
alias test="if [ ! -f filename ] ; then echo 'Irregular file'; exit 1 ; fi; if [ ! -r filename ]; then echo 'Unreadable file'; exit 2; fi;
問題は、これを実行すると、終了によってクライアント全体が閉じられることです。これを回避する方法はありますか?
答え1
これは Google で検索したときの最初のリンクです:
終了を括弧で囲むと
(exit 2)
すると、括弧内のサブシェルを終了することで戻りコードが設定され、現在のシェルは終了しません。その後、通常どおり $? を使用してそのコードをテストできます。
alias mytest="if [ ! -f filename ] ; then echo 'Irregular file'; (exit 1) ; elif [ ! -r filename ]; then echo 'Unreadable file'; (exit 2); fi"
答え2
シェル関数は、return
好きな値を取得できるはずです。
checktype() {
if [ ! -f "$1" ] ; then
echo 'Irregular file'
return 1
fi
if [ ! -r "$1" ]; then
echo 'Unreadable file'
return 2
fi
return 0
}
$ checktype /dev/stdin ; echo $?
Irregular file
1
また、test
これは標準 (組み込み) ユーティリティであるため、エイリアスや関数の名前としては最悪です。
別名はひどい選択だとは思いますが、現在教授からそれが求められています。
さて、これで少し状況が変わります。私の提案は、教授にもっと適切な解決策を示し、なぜその単純な解決策が機能しないのかを説明することです。
しかし、それがうまくいかなかったら、本当にしなければならないエイリアスを使用する場合、戻り値は実際には最後に実行されたコマンドの戻り値にすぎないことに注意してください。必要な値を返すものを作成できるはずです...
(宿題なら、すぐに完全な解答を出すのは公平ではないと思います。以下ネタバレ注意。)
ヒント: 任意の値を返すコマンドをすでに使用しました。
答え3
alias
ここでは不適切な選択です。これらの行を bash スクリプト ファイルに配置します。
#!/bin/bash
if [ ! -f filename ];
then echo 'Irregular file'; exit 1 ;
fi;
if [ ! -r filename ];
then echo 'Unreadable file'; exit 2;
fi;
意図したとおりに動作します。