私のスクリプトは多くのリモート呼び出しを実行し、長いタスクの進行状況を画面にSTDOUTに出力します。私は現在STDOUTとSTDERRを汚染したくないので、リモートコールからすべてのSTDOUTとSTDERRを隠します。
「ssh」を使用してリモート呼び出しでロギングを許可したり、スクリプトを呼び出すすべての人に対してSTDOUTとSTDERRをリダイレクトするにはどうすればよいですか?ファイル記述子について聞いたことがありますが、実装方法を理解できないようです。
ファイル記述子の投稿をたくさん見ましたが、このような出力を提供またはリダイレクトする投稿はありませんでした。
編集#1
これで、以前に設定した変数に基づいてリモート呼び出しを実行するコードが作成されました。次のようにすると:
remoteCall() {
(
command exec 1>&3
command exec 2>&4
${remoteCommand} $@
) &> /dev/null
}
3/4を1/2にリダイレクトしない限り、リモートコールの出力とエラーを隠す必要があります。したがって、誰かが私のスクリプトを大きな計画(この例よりはるかに大きい)として呼び出すと、STDOUTまたはSTDERRにエコーするものを除いて、画面に出力される内容はまったく表示されません。
この例のように RemoteCall の STDOUT を使用するには、次のようにします。
result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l")
必ずこのことをしなければなりませんか?
result=$(remoteCall "sudo lvs -o LV_NAME "${1}" --noheadings | wc -l" 3>1)
結果に行数が含まれますか?
ベストアンサー1
スクリプトでこれを行う場合:
ssh host cmd >&3 2>&4
これにより、スクリプトを呼び出す人は誰でも次のことができます。
your-script > output 2> error 3> remote-output 4> remote-error
ただし、fds 3または4をリダイレクトしないと、>&3
リダイレクトによって3: Bad file descriptor
致命的なエラーが発生します。
この場合、次のようにデフォルトで/ dev / nullにリダイレクトできます。
(
command exec >&3
command exec 2>&4
exec ssh host cmd...
) > /dev/null 2>&1
exec
以下の特別な組み込みコマンドを実行すると、command
リダイレクトが失敗した場合にサブシェルを終了する特殊効果が抑制されます。これらの失敗したリダイレクトによるエラーは、外部から簡単に削除できます> /dev/null 2>&1
。