tcshスクリプトで/ dev / stderrにリダイレクトする実験をいくつか行いました。私の意図は、スクリプトのユーザーが標準出力と標準エラーを(tcshでも)別の場所に送信できるようにすることでした。スクリプトは次のようにする必要があることがわかりました。
echo 1abc
echo 1ABC >>& /dev/stderr
echo 2abc
echo 2ABC >>& /dev/stderr
>>を使用しない場合、リダイレクトされたスクリプト出力で、標準入力および/または標準出力データの一部が失われます。それでも、単に>&を使用してスクリプトの出力をファイルにリダイレクトすることはできません。それも標準エラーの一部を失います(bashでも)。使用する必要があります
(SCRIPT >! file.out ) >&! file.err
構築します。ここでは、画面に出力するために、ファイルまたはその両方を/ dev / ttyにすることができます。(スクリプト出力をリダイレクトしない場合、問題はありません。)
プログラム内から標準エラーに指示する場合、この奇妙な現象は発生しないことに注意してください。
また、これはLinux(正確にはUbuntu-MATE LTS 16.04)上にあったことに注意してください。もちろん、上記を使用するには少なくとも/ dev / stderrが必要です。
これを投稿した後、さらに別の問題が見つかりました。1ABC行の後に標準エラーに書き込むプログラムを配置すると、標準エラーをファイルに送信すると1ABCが失われます。幸いなことに、私の場合、標準エラーは引き続き/ dev / ttyに移動する必要があります。うん :)
簡単な変更と/ dev / stderrのないシステムを可能にするために、次の2つのヘッダー行を使用してこれを実装することにしました。
alias stderr echo ; if (-ew /dev/stderr) alias stderr 'echo \!* >> /dev/stderr'
which echo_err > /dev/null ; if !($status) alias stderr echo_err
これにより、ユーザーはshスクリプトecho_errを配置できます。
#!/bin/sh
echo $* 1>&2
バグのない標準エラーのリダイレクトが本当に必要な場合は、パスで(2つのイメージのアクティブ化を犠牲にして)。
別の追加:上記の私の投稿は、tcsh内の/ dev / stderrへのリダイレクトの問題に関するものでした。ただし、エイリアスを提供している限り、Glen Raganのソリューション用のエイリアスも提供する必要があります。これは、イメージのアクティブ化を気にしない場合は非常に便利です。定義する
alias 1to2 '\!* | sh -c "cat 1>&2"'
alias 2to1 '\!* |& cat'
次に、標準出力を1to2でstdoutにリダイレクトするコマンドの前に置くことができます。これは、DOSを含む他のシェルでコマンドの前に1>&2を付けるのと同じように機能します。また、Linuxではバグがありません。2to1もあります。:)
OOPS:上記の1to2の小さな欠陥:コマンドが標準出力と標準エラーの両方に書き込む場合、順序が間違っています。コマンドの標準エラーは、最終的な標準エラーの結果の標準出力よりも先に終了します。解決策は簡単です。変更| に|&:
alias 1to2 '\!* |& sh -c "cat 1>&2"'
ごめんなさい
echo test >&2
stderrに出力します。少なくとも私のbashでは。