stderrを関数にリダイレクトします。 2>が非ブロックのようです。必要です。

stderrを関数にリダイレクトします。 2>が非ブロックのようです。必要です。

何が起こっているのかについての機能が含まれていることに注意してください。 ibmcloud CLI自体は関係がなく、プロンプトだけがあり、これが問題です。

私はそれを使用していますzsh。私は次の機能を持っています:

kcu() {
  kcu_match=`kcg | grep $1 | awk '{print $2}'`
  if [[ -z $kcu_match ]]; then
    echo No match for context \"$1\"
  else
    kc use-context $kcu_match
    # Do a trivial operation to determine login
    k get namespace 1>/dev/null 2> >(kcu-iferror $kcu_match)
  fi
}
# version for the first screenshot..
# kcu-iferror() {
#  while read line; do
#    # if we are here we have an error
#    slm-login-ic $1
#    # first line is enough
#    break
#  done
# }

#version for the second screenshot..
kcu-iferror() {
  login=0
  while read line; do
    login=1
    # shows the output (in this case 2 lines but doesn't matter)
    echo "line: $line"
    break
  done
  echo "value: $login"
  if [[ $login -eq 1 ]]; then
    slm-login-ic $1
  fi
}


slm-login-ic() {
  echo Log in to $1..
  echo ">> " ibmcloud login -a cloud.ibm.com -r us-south -g Default --sso
  ibmcloud login -a cloud.ibm.com -r us-south -g Default --sso
  echo ">> " ibmcloud ks cluster config --cluster $1
  ibmcloud ks cluster config --cluster $1
}

ただ電話すれば大丈夫だと思いますslm-login-ic my-cluster-id

ただし、実行するとkcu my-cluster-id問題が発生します。エラー出力は、ibmcloud「デフォルトブラウザでURLを開くか?」というプロンプトへの入力として使用されます。送信してください(下のスクリーンショット)。

ユーザーが入力できるようにこれが発生しないようにするにはどうすればよいですかY?ボーナスの質問:ユーザーがプロンプトに応答する必要がないように、
「error」をaに変更するにはどうすればよいですか?Y

ここに画像の説明を入力してください。

アップデート - ストーリーは続きます

したがって、いくつかの実験を行った後、実際の問題は次のとおりです。2> >(something)非ブロックです。。これは私のCLIコマンドが停止していますが、エラーリダイレクト(少し時間がかかります)がまだ内容を出力しており、通常問題を引き起こすことを意味します。

その後、質問は次のようになります。 STDERRブロックをリダイレクトする方法は?ありがとう

アップデート - 最後の「非ブロック」インターセプタまで

完全なエラーメッセージを繰り返すことで、少なくとも実際のエラーメッセージを停止できます。ワイヤーibmcloudY / nに投稿するように求められます。しかし、それが公開されるのを完全に防ぐことはできません。問題全体の鍵は、a)親シェル/プロセスを待機させ、b)エラーオブジェクトが子シェル/プロセスのプロンプトに表示されないようにする方法です(この場合)。ありがとう

私は次のすべてを試しました。

      k get namespace -A 2>&1 1>/dev/null | kcu-iferror $kcu_match
    { k get namespace -A } 1>/dev/null 2> >(kcu-iferror $kcu_match)
      k get namespace -A 2>&1 1>/dev/null | kcu-iferror $kcu_match
    { k get namespace -A } 2>&1 1>/dev/null | kcu-iferror $kcu_match

ここに画像の説明を入力してください。

ベストアンサー1

マニュアルに記載されているように解決策は、出力をリダイレクトするプロセスを現在のシェルのジョブとして実行することです。

    # Do a trivial operation to determine login
    { k get namespace } 1>/dev/null 2> >(kcu-iferror $kcu_match)

これにより、親シェルはプロセスが完了するのを待ちます。

おすすめ記事