무슨 일이 일어나고 있는지에 대한 기능을 포함했다는 점에 유의하세요. 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 차단을 리디렉션하는 방법은 무엇입니까? 감사해요
업데이트 - 최종 "비차단" 인터셉터까지
전체 오류 메시지가 반복되도록 함으로써 최소한 실제 오류 메시지는 중지할 수 있습니다.철사ibmcloud
Y/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)
이로 인해 상위 셸은 프로세스가 완료될 때까지 기다리게 됩니다.