SSHクライアントを終了せずにコマンドラインで戻りコードをどのように設定できますか?

SSHクライアントを終了せずにコマンドラインで戻りコードをどのように設定できますか?

私は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;

期待どおりに動作します。

関連情報