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)

이로 인해 상위 셸은 프로세스가 완료될 때까지 기다리게 됩니다.

관련 정보