Linux は、stderr が存在する場合にのみ状況に合わせて stderr を処理します。

Linux は、stderr が存在する場合にのみ状況に合わせて stderr を処理します。

実際に存在する場合にのみプロセスを呼び出したい。はいSTDERRが存在するが実際に存在するかどうかを評価する方法がわかりません。このコードは:

errtest() {
  kubectl get namespace -A
  kubectl get namespace -A 2> >(echo "why am I here")
}
> errtest

出力:

NAME                               STATUS   AGE
2c74fd3b89e64077afd34d8ab8af4f09   Active   10d
845d1f1c71ed42c8b9e4c780992a95c0   Active   367d
why am I here
NAME                               STATUS   AGE
2c74fd3b89e64077afd34d8ab8af4f09   Active   10d
845d1f1c71ed42c8b9e4c780992a95c0   Active   367d

明らかに、出力が最初に表示されたときに問題はありません。したがって、主な質問はなぜ「私はここにいるのですか?」です。これは直観にずれているようです。

2番目の質問は、この場合にコンテキストを処理できるようにSTDERRをどのように識別しますか?それは次のとおりです。

      kubectl get namespace -A 2> >(if [[ -z STDERR ]]; then echo "there is an error"; fi)

答え1

したがって、この問題を解決するために必要な理解は次のとおりです。

>(echo "why am I here")

..具体的にはリソース一行ずつ読むことができます。 AFAIKリソースは(簡単に)配信できなくなりました。または変数参照として使用されます。これが私の解決策です。

errtest() {
  random_variable="hello this works"
  # yes you can pass parameters as well..
  kubectl get namespace -A 2> >(errtest_if $random_variable)
}
errtest_if() {
  while read line; do
    echo "parameter 1 is $1"
    echo $line          #<< first line of the error
    #evaluate it if desired
    echo "looks like you are not logged in"
    #maybe call something else if desired

    #break if you only need to know there _is_ an error
    break
  done
}
> errtest

注:使用法については、ifnea)私のLinuxにはインストールされておらず、b)これが私に当てはまる場合は、他の人にも適用する必要があるため、これを行わないことにしました。

関連情報