git 설치 / 제거를 자동화하는이 스크립트를 만들었습니다. git이 설치되었는지 테스트하는 기능에서 git --version
명령을 사용하고 반환 코드를 테스트합니다.
나는 멋진 사용자 정의 출력을 만들려고 할 때 정상적으로 발생하는 stderr 출력을 싫어합니다. 이 기능에 대해서만 stderr을 억제하는 방법을 알아 냈지만 다시 활성화 할 수없는 것 같습니다.
read
이 함수를 호출 한 후 내 프롬프트가 사라졌습니다.
function CheckGit() {
exec 3>&2 # link file desc 3 w/ stderr
exec 2> /dev/null
SILENT_MODE=$1
if [[ ! $(git --version) ]]; then
if [ SILENT_MODE ]; then
printf "${LT_RED} GIT IS NOT INSTALLED.\n"
fi
continue;
else
if [ SILENT_MODE ]; then
printf "${LT_BLUE} GIT IS CURRENTLY INSTALLED.\n"
fi
continue;
fi
GIT_INSTALLED=$?
#turn back on the stderr notifications
exec 2>&3 3>&- # Restore stdout and close file descriptor #3
}
while true; do
printf "${LT_BLUE} Menu\n"
printf " ***********************************************\n"
printf "${LT_GREEN} a) Check git.\n"
printf "${LT_GREEN} b) (More to be added)\n"
printf "${LT_GREEN} c) ...\n"
printf "${LT_GREEN} d) ...\n"
printf "${LT_GREEN} h) ...\n"
printf "${LT_RED} x) Exit.\n"
printf "\n${NC}"
read -p "Please make a selection: " eotuyx
case $eotuyx in
[Aa]* ) CheckGit true; continue;;
[Bb]* ) ...; continue;;
[Cc]* ) ...; continue;;
[Dd]* ) ...; continue;;
[Hh]* ) ...; continue;;
[XxQq]* ) break;;
* ) -e "\n${NC}" + "Please answer with a, b, c, d, x(or q).";;
esac
done
주어진 조언을 반복하려면 코멘트를 :
continue
명령문을 삭제하십시오 CheckGit
.
while true
의 맨 위에 있는 명령문으로의 즉각적인 리턴을 야기 합니다. 따라서 Tomasz가 지적했듯이 귀하의 exec 2>&3 3>&-
진술은 실행되지 않습니다.일반 사항 :
if [ SILENT_MODE ]
mosvy가 지적했듯이 문자열 SILENT_MODE
이 null이 아닌지 테스트하기 때문에 항상 true 입니다. 당신은 원하는 것 같습니다 if [ "$SILENT_MODE" ]
.if [ "$SILENT_MODE" ]
경우에도 마찬가지입니다 $SILENT_MODE
입니다 false
- 그것은 문자열이 아닌 널인지 테스트를하고있어 모든 호출 때문에 CheckGit false
여전히 정보가 발생합니다하는 것은 표시되는.if [ "$SILENT_MODE" = false ]
하거나 그렇지 않으면 변수를 호출하는 것이 다소 의미가 VERBOSE_MODE
있습니다.$?
매우 일시적입니다. 항상 가장 최근 명령 의 결과입니다 . 그래서 만약 당신이git이 설치되어 있는지 확인 하면 ; then printf "GIT가 설치되지 않았습니다. \ n" else printf "GIT가 현재 설치되었습니다. \ n" fi GIT_INSTALLED = $?다음
GIT_INSTALLED
의 종료 상태를 가져옵니다 printf
. GIT_INSTALLED
더 일찍 설정해야합니다 .if [[ ! $(git --version) ]]; then
테스트는 "반환 코드"(질문에서 말한대로)가 아니라 git --version
표준 출력에 어떤 내용을 기록 하는지 여부 입니다. 그것은 당신이 원하는 것일 수 있습니다. git
설치 여부를 테스트하는 가장 좋은 방법 일 수 있습니다 . 그러나 명령의 종료 상태를 확인하는 것이 더 좋을 수 있습니다 (일반적으로 더 낫습니다).if
- then
- else
은 "진정한"부분은 첫번째 경우 쉽게 문은 이해합니다. 당신의 스크립트는자식이 설치되지 않은 경우 다음 이 설치되지 않은 것으로 표시 (가 않다면, 즉 다른 NOT 설치되지 않은 ) 가 설치되어 있다고 파이를이중 네거티브는 혼란 스럽습니다.
exec 2> /dev/null
연속 된 42 개 문에서 표준 오류를 억제하려는 경우 유용합니다. 단일 명령에만 영향을 미치 려면 mosvy가 제안한 대로 해당 명령에 입력 2> /dev/null
(또는 > /dev/null 2>&1
)하면됩니다 .이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다