Bash : 억제 후 stderr 다시 켜기

브레 토 네이터

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
스콧

주어진 조언을 반복하려면 코멘트를 :

  1. 함수 에서 continue명령문을 삭제하십시오 CheckGit.
    • 필요하지 않습니다.
    • 그리고-당신이 깨닫지 못했던 것-그것들은 (함수에서) 메인 루프로의 즉각적인 리턴뿐만 아니라 메인 루프 while true의 맨 위에 있는 명령문으로의 즉각적인 리턴을 야기 합니다. 따라서 Tomasz가 지적했듯이 귀하의 exec 2>&3 3>&-진술은 실행되지 않습니다.

일반 사항 :

  1. if [ SILENT_MODE ]mosvy가 지적했듯이 문자열 SILENT_MODE이 null이 아닌지 테스트하기 때문에 항상 true 입니다. 당신은 원하는 것 같습니다 if [ "$SILENT_MODE" ].
  2. 그러나 당신은 자신을 속일 수 있습니다.  if [ "$SILENT_MODE" ]경우에도 마찬가지입니다 $SILENT_MODE입니다 false- 그것은 문자열이 아닌 널인지 테스트를하고있어 모든 호출 때문에 CheckGit false여전히 정보가 발생합니다하는 것은 표시되는.
  3. 그리고 자신을 속이지 않더라도 다음 주에이 스크립트를 유지해야하는 사람을 속일 수 있습니다. 그리고 네, 그 사람이 당신 일 수도 있습니다. 명백한 논리는 "자동 모드 인 경우 추가 정보보고"입니다. 그것은 논리적으로 거꾸로되어 있습니다. if [ "$SILENT_MODE" = false ]하거나 그렇지 않으면 변수를 호출하는 것이 다소 의미가 VERBOSE_MODE있습니다.
  4. $?매우 일시적입니다. 항상 가장 최근 명령 의 결과입니다 .   그래서 만약 당신이
    git이 설치되어 있는지 확인 하면   ; then 
        printf "GIT가 설치되지 않았습니다. \ n" 
    else 
        printf "GIT가 현재 설치되었습니다. \ n" 
    fi 
    GIT_INSTALLED = $?
    다음 GIT_INSTALLED의 종료 상태를 가져옵니다 printf. GIT_INSTALLED더 일찍 설정해야합니다 .
  5. 테스트,, if [[ ! $(git --version) ]]; then테스트는 "반환 코드"(질문에서 말한대로)가 아니라 git --version표준 출력에 어떤 내용을 기록 하는지 여부 입니다. 그것은 당신이 원하는 것일 수 있습니다. git설치 여부를 테스트하는 가장 좋은 방법 일 수 있습니다 . 그러나 명령의 종료 상태를 확인하는 것이 더 좋을 수 있습니다 (일반적으로 더 낫습니다).
  6. 스타일 참고 : 나는 찾기 if- then- else은 "진정한"부분은 첫번째 경우 쉽게 문은 이해합니다. 당신의 스크립트는
    자식이 설치되지 않은 경우 
    다음 
        이 설치되지 않은 것으로 표시 
    (가 않다면, 즉 다른 NOT 설치되지 않은 ) 
        가 설치되어 있다고 
    파이를
    이중 네거티브는 혼란 스럽습니다.
  7. 그리고, 예; exec 2> /dev/null연속 된 42 개 문에서 표준 오류를 억제하려는 경우 유용합니다. 단일 명령에만 영향을 미치 려면 mosvy가 제안한 대로 해당 명령에 입력 2> /dev/null(또는 > /dev/null 2>&1)하면됩니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

bash 스크립트에서 stderr 메시지 억제

분류에서Dev

bash에서 stdout 및 stderr를 억제하는 방법

분류에서Dev

Linux는 파일 삭제와 결합 된 bash 스크립트에서 찾기 오류를 억제합니다.

분류에서Dev

Python 하위 프로세스는 stdout 및 stderr를 억제합니다.

분류에서Dev

-메시지 제출 및 억제 후 양식 재설정

분류에서Dev

내 응용 프로그램은 삭제 후 로그인 암호를 기억하고 새로 설치합니다.

분류에서Dev

SAS 9.4-ODS HTML CLOSE 후 결과 뷰어를 다시 활성화하지만 HTML 본문 파일 쓰기 억제

분류에서Dev

그룹의 첫 번째 인스턴스가 표시된 후 그룹 헤더의 내용을 억제합니다.

분류에서Dev

허용하지 않은 후 구문 분석을 위해 푸시 알림 켜기

분류에서Dev

Bash는 Esc 키를 누른 후 키 누르기를 무시합니다.

분류에서Dev

Bash는 Esc 키를 누른 후 키 누르기를 무시합니다.

분류에서Dev

bash 스크립트를 통해 mongo 셸에서 메시지 억제

분류에서Dev

bash로 출력을 억제하는 일반 기능-공백 파일 이름

분류에서Dev

Microsoft Graph는 인증 후 사용자를 기억합니다.

분류에서Dev

점프 및 점프 시간 기억 문제

분류에서Dev

각도기에서 오류 메시지 억제

분류에서Dev

컬링 후 Bash에서 후행 슬래시를 제거 하시겠습니까?

분류에서Dev

기억력에 문제가 있습니다

분류에서Dev

RabbitMQ 대기열은 생성 후 즉시 삭제됩니다. 왜?

분류에서Dev

다른 하나를 제시 한 후 UIViewController 닫기

분류에서Dev

draggable을 다시 초기화 한 후 jQueryUI Sortable 복제 요소

분류에서Dev

bash stdout + stderr를 한 파일로, stderr를 다른 파일로 리디렉션

분류에서Dev

몇 초 후 알림 켜기 / 끄기

분류에서Dev

끄기 후 클릭 이벤트 켜기

분류에서Dev

끄기 후 클릭 이벤트 켜기

분류에서Dev

1 분 후 Seagate HDD 켜기 / 끄기

분류에서Dev

일시 중지 후 Macbook 화면이 다시 켜짐

분류에서Dev

.htaccess .php 다시 쓰기 / 후

분류에서Dev

펼친 후 다시 접기

Related 관련 기사

  1. 1

    bash 스크립트에서 stderr 메시지 억제

  2. 2

    bash에서 stdout 및 stderr를 억제하는 방법

  3. 3

    Linux는 파일 삭제와 결합 된 bash 스크립트에서 찾기 오류를 억제합니다.

  4. 4

    Python 하위 프로세스는 stdout 및 stderr를 억제합니다.

  5. 5

    -메시지 제출 및 억제 후 양식 재설정

  6. 6

    내 응용 프로그램은 삭제 후 로그인 암호를 기억하고 새로 설치합니다.

  7. 7

    SAS 9.4-ODS HTML CLOSE 후 결과 뷰어를 다시 활성화하지만 HTML 본문 파일 쓰기 억제

  8. 8

    그룹의 첫 번째 인스턴스가 표시된 후 그룹 헤더의 내용을 억제합니다.

  9. 9

    허용하지 않은 후 구문 분석을 위해 푸시 알림 켜기

  10. 10

    Bash는 Esc 키를 누른 후 키 누르기를 무시합니다.

  11. 11

    Bash는 Esc 키를 누른 후 키 누르기를 무시합니다.

  12. 12

    bash 스크립트를 통해 mongo 셸에서 메시지 억제

  13. 13

    bash로 출력을 억제하는 일반 기능-공백 파일 이름

  14. 14

    Microsoft Graph는 인증 후 사용자를 기억합니다.

  15. 15

    점프 및 점프 시간 기억 문제

  16. 16

    각도기에서 오류 메시지 억제

  17. 17

    컬링 후 Bash에서 후행 슬래시를 제거 하시겠습니까?

  18. 18

    기억력에 문제가 있습니다

  19. 19

    RabbitMQ 대기열은 생성 후 즉시 삭제됩니다. 왜?

  20. 20

    다른 하나를 제시 한 후 UIViewController 닫기

  21. 21

    draggable을 다시 초기화 한 후 jQueryUI Sortable 복제 요소

  22. 22

    bash stdout + stderr를 한 파일로, stderr를 다른 파일로 리디렉션

  23. 23

    몇 초 후 알림 켜기 / 끄기

  24. 24

    끄기 후 클릭 이벤트 켜기

  25. 25

    끄기 후 클릭 이벤트 켜기

  26. 26

    1 분 후 Seagate HDD 켜기 / 끄기

  27. 27

    일시 중지 후 Macbook 화면이 다시 켜짐

  28. 28

    .htaccess .php 다시 쓰기 / 후

  29. 29

    펼친 후 다시 접기

뜨겁다태그

보관