Linux 의 2 > & 1 은 도대체 무엇 입 니까?

4549 단어 Shell
우 리 는 리 눅 스에 서 자주 이런 형식의 명령 을 받는다.우선 우 리 는 이 명령 을 대충 분해 했다.
  • 우선 nohup command>/dev/null 2>&1 & 입 니 다. 현재 사용자 와 시스템 의 세 션 에서 프로 세 스 가 응답 HUP 메 시 지 를 무시 한 다 는 뜻 입 니 다.
  • & 이 명령 을 다음 데스크 의 job 형식 으로 실행 합 니 다.
  • command >/dev/null 은 잘 이해 합 니 다./dev/null 은 빈 장 치 를 표시 합 니 다. 즉, command 의 실행 결 과 를 빈 장치 로 바 꾸 는 것 입 니 다. 즉, 어떤 정보 도 표시 하지 않 는 다 는 것 입 니 다.

  • 블랙홀그것 은 문서 만 쓰 는 것 과 같다.그 내용 을 쓰 면 영원히 잃 어 버 리 고 그 내용 을 읽 으 려 고 시도 하면 아무것도 읽 을 수 없다.
    그럼 2 > & 1 은 또 무슨 뜻 이에 요?
    몇 가지 기본 기호 와 그 의미:
  • /dev/null 은 빈 장치 파일 을 표시 합 니 다.
  • 0 은 stdin 표준 입력 을 나타 낸다.
  • 1 은 stdout 표준 출력 을 나타 낸다.
  • 2 는 stderr 표준 오 류 를 나타 낸다.
  • nohup 부터 말하자면
    사실 이 명령 은 약어 판 으로 재 정립 명령 에 대해 서 는 command>/dev/null 이런 형식 이 분명 하 다. 그러면 a > b command 가 a 의 역할 을 하 는 것 일 까? command > /dev/null b 의 역할 을 하 는 것 일 까?이렇게 보면 비교적 합 리 적 으로 보이 지만 사실은 하나의 명령 은 a 를 충당 할 수 없 을 것 이다. 분명히 command 가 실행 하 는 출력 으로 a 를 충당 하 는 것 이 고 사실은 표준 출력 stdout 이다.그래서 /dev/null 집행 한 셈 이다 command > /dev/null.command 를 실행 하면 표준 출력 stdout (1 로 표시) 을 만 들 고 command 1 > /dev/null 장치 파일 로 다시 설정 합 니 다.
    말 해 봐 /dev/null2>&1 를 통 해 command > /dev/null 와 등가 하면 command 1 > /dev/null 에 대해 서도 이해 할 수 있다. 2 는 표준 오류 이 고 1 은 표준 출력 이다. 그러면 이 명령 은 표준 오 류 를 표준 출력 으로 바 꾸 는 것 과 같 지 않 느 냐?2>&12>1 의 서법 은 어떤 차이 가 있 습 니까?
  • 2>&1 의 역할 은 표준 오류 의 출력 을 1 로 바 꾸 는 것 이지 만 이 1 은 표준 출력 이 아니 라 파일 입 니 다!!!파일 이름 이 1 입 니 다.
  • 2>1 의 역할 은 표준 오류 의 출력 을 표준 출력 1 로 바 꾸 는 것 이다.
  • 2>&1command>a 2>a 의 차이
    위의 분석 을 통 해 command>a 2>&1 이 명령 에 대해 등가 command>a 2>&1 는 command 를 실행 하 는 표준 입력 이 파일 a 로 바 뀌 었 고 표준 오류 도 파일 a 로 바 뀌 었 다 고 이해 할 수 있다.그럼 command 1>a 2>&1 등가 가 command 1>a 2>&1 라 고 해 야 하나 요?사실은 그렇지 않 습 니 다. command 1>a 2>acommand 1>a 2>&1 는 차이 가 있 습 니 다. 전 자 는 파일 a 를 한 번 만 열 고 후 자 는 파일 을 두 번 열 어서 stdout 이 stderr 에 의 해 덮어 씌 워 집 니 다.command 1>a 2>a 의 의 미 는 표준 출력 으로 의 인용 으로 이해 할 수 있 고 표준 출력 으로 열 린 a 를 참조 하 는 것 이다.IO 효율 로 볼 때 &1command 1>a 2>&1 보다 효율 이 높다.
    왜 2 > & 1 을 뒤에 써 야 합 니까?
    index.php task testOne >/dev/null 2>&1
    우 리 는 왼쪽 이 표준 출력 이 라 고 이해 할 수 있다. 자, 현재 표준 출력 은 command 1>a 2>a 에 직접 입력 되 고 /dev/null 은 표준 오 류 를 표준 출력 으로 바 꾸 기 때문에 프로그램 이 잘못 되 었 을 때 오류 가 왼쪽으로 흐 르 는 것 과 같 고 왼쪽 은 2>&1 에 입력 되 어 있다.
    중간 에 쓰 면 표준 출력 을 차단 하 는 파일 로 이해 할 수 있다.
    사용 할 수 있 습 니 다:
  • ls 2 > 1 테스트 를 해 보 세 요. 2 파일 이 없 는 오 류 는 보고 하지 않 지만 빈 파일 1 을 출력 합 니 다.
  • ls xxx 2 > 1 테스트 에서 xxx 라 는 파일 의 오류 가 1 에 출력 되 지 않 았 습 니 다.
  • ls xxx 2 > & 1 테스트, 1 이 파일 을 생 성하 지 않 지만 표준 출력 으로 오류 가 발생 했 습 니 다.
  • ls xxx > out. txt 2 > & 1, 실제 ls xxx 1 > out. txt 2 > & 1 로 바 꿀 수 있 습 니 다.리 셋 기호 > 기본 값 은 1 입 니 다. 오류 와 출력 이 out. txt 로 전 달 됩 니 다.

  • 밤 을 들다
    셸 하나 주세요.
    //test.sh
    #!/bin/sh
    t
    date
    /dev/null test. sh 에 실행 권한 을 추가 합 니 다.여기 서 우 리 는 두 가지 명령 을 구 했 습 니 다. 그 중에서 t 명령 은 존재 하지 않 습 니 다. 실행 하면 잘못 보고 하고 stderr 로 출력 합 니 다.날짜 가 정상적으로 실 행 됩 니 다. 실행 은 현재 시간 을 출력 하고 stdout 으로 출력 합 니 다.
    실행 chmod +x test.sh 결 과 는:
    stderr 가 res1. log 로 바 뀌 지 않 았 고 stderr 가 화면 에 인쇄 되 었 음 을 발 견 했 습 니 다.이 는 위 에서 말 한 ./test.sh > res1.log 등가 가 ./test.sh > res1.log 임 을 한층 더 증명 했다.
    실행 ./test.sh 1>res1.log 결 과 는:
    이번에 우 리 는 stdout 과 stderr 가 모두 res2. log 로 재 설정 되 었 다 는 것 을 발견 했다.위 에서 저 희 는 stderr, 즉 2 에 대해 어떻게 출력 하 는 지 설명 하지 않 았 습 니 다. stderr 는 화면 에 출력 되 었 습 니 다. 여기 서 저 희 는 stdout 에 대해 설명 할 뿐만 아니 라 res2. log 로 재 설정 되 었 습 니 다. 표준 오류 에 대해 서도 설명 을 했 습 니 다. res2. log 의 참조 인 res2. log 의 파일 설명 부호 로 재 설정 되 었 습 니 다.
    다시 한 번 생각해 보 자.
    ./test.sh>res2.log 2>&1 command > 1 뒤에 써 야 합 니까? 직접 2 로 써 도 됩 니까?예 를 들 면 2>&1.사실 이러한 용법 도 가능 합 니 다. ls 명령 은 현재 디 렉 터 리 를 보 여 줍 니 다. stdout (1) 으로 표시 합 니 다. 이 때 stderr (2) 가 없 기 때문에 이 때 실행 ls 2>a 도 a 파일 을 정상적으로 만 들 수 있 습 니 다. 그러나 a 파일 은 비어 있 습 니 다. 이 때 ls 를 실행 하면 stderr (2) 가 발생 하지 않 았 기 때 문 입 니 다.

    좋은 웹페이지 즐겨찾기