bash 関数はコマンドを引数として実行します。

bash 関数はコマンドを引数として実行します。

私はbashスクリプトを作成しており、ホスト名、コマンド、およびファイルという3つのパラメータを使用する関数があります。そのホスト名からコマンドを実行し、出力をファイル名にリダイレクトする必要があります。機能は次のとおりです。

execmd ()
    {
    P_SERV="$1"
    P_CMD="$2"
    P_OUT="$3"

    X_SERV=`hostname`
    if [ "$P_SERV" = "$X_SERV" ] ; then
       $P_CMD >> $P_OUT
    else
       ssh $P_SERV $P_CMD >> $P_OUT
    fi
    }

私が実行したとき:

execmd venus "cat /proc/meminfo" /tmp/meminfo

エラーが発生しました。

cat /proc/meminfo: no such file or directory

なぜ動作しないのかご存知ですか?ローカルホスト名またはリモートホスト名を使用して呼び出すときの動作は同じです。

答え1

SSHはリモートシェルを実行します。ローカル実行と一貫した動作を得るには、ローカルシェルを実行してください。

if [ "$P_SERV" = "$X_SERV" ] ; then
   sh -c "$P_CMD" >> "$P_OUT"
else
   ssh "$P_SERV" "$P_CMD" >> "$P_OUT"
fi

忘れないで代替項目を二重引用符で囲みます。。たとえば、二重引用符なしでP_CMDワイルドカードを含めると、に含まれますssh $P_SERV $P_CMD

関連情報