Bash 스크립트 stderr 및 stdout

user3112318

첫째, 질문을 올바르게 공식화하고 있는지 잘 모르겠습니다. 그래서 시스템에서 사용자를 삭제하는 bash 스크립트가 있습니다. 문제는 터미널 코드 앞에 err msg를 표시한다는 것입니다. 여기. 암호:

echo -e "\nCommencing user $UserName removal"
echo -e "Deactivating $UserName shell account ..." "$(chsh -s /usr/bin/false $UserName)"
echo -e "Listing group(s) user: " "$(groups $UserName)"
echo -e "Removing Crontab ... " "$(crontab -r -u $UserName)"

출력은 다음과 같습니다.

Commencing user Test2 removal
chsh: unknown user: Test2
Deactivating Test2 shell account ...
groups: Test2: no such user
Listing group(s) user:  
scripts/sudo.sh: line 332: /delete_Test2/crontab.bak: No such file or directory
Saving Crontab ...  

삭제할 사용자는 Test2이며,이 경우 "아마도"존재하지 않습니다 (다른 시간 동안 다른 질문). 이제 stderr msg가 명령 위가 아닌 명령 옆이나 아래에 표시되지 않습니까?

미리 감사드립니다

고든 데이비슨

쉘이 라인을 실행할 때 echo -e "Deactivating $UserName shell account ..." "$(chsh -s /usr/bin/false $UserName)"이벤트 순서는 다음과 같습니다.

  1. 쉘이 실행 chsh -s /usr/bin/false Test2되고 stdout이 캡처 버퍼로 이동하여 쉘이 나중에 사용할 수 있습니다.
  2. chsh"Test2"가 존재하지 않으며 "chsh : unknown user : Test2"를 해당 stderr에 인쇄합니다. 쉘이 stderr로 특별한 작업을 수행하지 않았기 때문에, 이것은 터미널 인 쉘의 stderr로 직접 이동합니다.
  3. chsh 출구
  4. 쉘은 캡처 된 출력 (참고 : stderr이 아닌 stdout)을 chsh( 아무것도 없음)에서 가져 와서 echo명령 줄로 대체 하여echo -e "Deactivating Test2 shell account ..." ""

오류 메시지는 2 단계에서 인쇄되지만 일어날 일에 대한 메시지는 4 단계까지 인쇄되지 않습니다.

이를 해결하는 방법에는 여러 가지가 있습니다. 일반적으로 가장 좋은 방법은 명령의 출력을 캡처 한 다음이를 반향하는 전체적인 혼란을 피하는 것입니다. 그것은 무의미하고 단지 이와 같은 혼란으로 이어집니다 (그리고 당신이 마주 치지 않은 다른 것들). 명령을 직접 실행하고 출력 (stdout 및 stderr 모두)을 정상적인 순서대로 정상적인 위치로 이동하십시오.

BTW, 나는 또한 피하는 것이 좋습니다 echo -e, 또는 참 echo -anything. 에 대한 POSIX 표준은echo "구현은 어떤 옵션을 지원하지 않는다."라고 실제로 일부 구현은 옵션을 지원합니다. 다른 사람들은 인쇄 할 문자열의 일부로 처리합니다. 또한 \n일부는 인쇄 할 문자열의 이스케이프 시퀀스 (예 :)를 해석 하고, 일부는하지 않으며, 일부 -e는 지정된 경우에만 수행 합니다 (POSIX 표준 위반). 이러한 기능이 얼마나 예측할 수 없는지를 감안할 때 그러한 불확실한 상황을 피하고 printf대신 사용 ( 사용하기 더 복잡하지만 훨씬 더 예측 가능)하거나 (귀하의 경우처럼) echo각 줄에 대해 별도의 명령을 사용하는 것이 가장 좋습니다 .

또한 공백, 와일드 카드 등이 포함 된 경우를 대비하여 거의 항상 큰 따옴표 변수 참조 (예 : groups "$UserName"대신 groups $UserName) 를 사용해야합니다 .

위의 내용을 바탕으로 스크립트를 작성하는 방법은 다음과 같습니다.

echo    # print a blank line
echo "Commencing user $UserName removal"
echo "Deactivating $UserName shell account ..."
chsh -s /usr/bin/false "$UserName"

echo "Listing group(s) user: "
groups "$UserName"

echo "Removing Crontab ... "
crontab -r -u "$UserName"

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

침해가 발생한 경우 연락 주시기 바랍니다debugcn@gmail.com 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

bash 스크립트 내부에서 STDOUT에서 LOG로, STDERR에서 LOG 및 콘솔로

분류에서Dev

bash 스크립트의 모든 명령에 대한 stdout 및 stderr의 출력을 파일에 추가

분류에서Dev

stdout / stderr을 bash 스크립트로 리디렉션

분류에서Dev

스크립트에 stdout 및 stderr로 출력되지 않음

분류에서Dev

BASH 타임 스탬프를 stdout 및 stderr 앞에 추가

분류에서Dev

bash 스크립트에서 stdin 및 stdout 리디렉션

분류에서Dev

스크립트 stderr 및 stdout을 파일로 리디렉션하지만 stdout도 tty로 유지합니까?

분류에서Dev

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

분류에서Dev

쉘 스크립트 stdout / stderr을 파일 / s 및 콘솔에 인쇄하는 방법

분류에서Dev

Node.js의 자식 프로세스 stdout 및 stderr 열 크기

분류에서Dev

Ruby에서 스트리밍 stdout 및 stderr 캡처

분류에서Dev

두 개의 개별 스트림에 stdout 및 stderr 표시

분류에서Dev

두 개의 개별 스트림에 stdout 및 stderr 표시

분류에서Dev

Bash 스크립트 및 stdin

분류에서Dev

bash 스크립트 내에서 타임 스탬프가있는 파일에 stdout과 stderr을 모두 복사하는 방법은 무엇입니까?

분류에서Dev

stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

분류에서Dev

stdout과 stderr을 bash 스크립트 내에서 파일로 리디렉션하는 방법은 무엇입니까?

분류에서Dev

azure-ml에서 R 스크립트 디버깅 : stdout 및 stderr 로그는 어디에서 찾을 수 있나요? (또는 왜 비어 있습니까?)

분류에서Dev

Redirect stdout and stderr when ampersand(&) is used between commands in bash

분류에서Dev

lftp, stdout, stderr 및 SAP exec_protocol

분류에서Dev

PowerShell 결합 및 로그 Stderr / Stdout

분류에서Dev

STDIN, STDOUT, STDERR 및 반환 값 정보

분류에서Dev

파일에 stderr 및 stdout 추가

분류에서Dev

GNU 병렬 정렬 stdout 및 stderr

분류에서Dev

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

분류에서Dev

Bash 스크립트 및 프로세스

분류에서Dev

프로세스 ID가 제공된 프로세스의 stderr 및 stdout보기

분류에서Dev

내 Django 앱에서 Celery의 하위 프로세스 stdout 및 stderr에 액세스

분류에서Dev

함수 및 트랩 종료 신호에 stderr / stdout 메시지 보내기

Related 관련 기사

  1. 1

    bash 스크립트 내부에서 STDOUT에서 LOG로, STDERR에서 LOG 및 콘솔로

  2. 2

    bash 스크립트의 모든 명령에 대한 stdout 및 stderr의 출력을 파일에 추가

  3. 3

    stdout / stderr을 bash 스크립트로 리디렉션

  4. 4

    스크립트에 stdout 및 stderr로 출력되지 않음

  5. 5

    BASH 타임 스탬프를 stdout 및 stderr 앞에 추가

  6. 6

    bash 스크립트에서 stdin 및 stdout 리디렉션

  7. 7

    스크립트 stderr 및 stdout을 파일로 리디렉션하지만 stdout도 tty로 유지합니까?

  8. 8

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

  9. 9

    쉘 스크립트 stdout / stderr을 파일 / s 및 콘솔에 인쇄하는 방법

  10. 10

    Node.js의 자식 프로세스 stdout 및 stderr 열 크기

  11. 11

    Ruby에서 스트리밍 stdout 및 stderr 캡처

  12. 12

    두 개의 개별 스트림에 stdout 및 stderr 표시

  13. 13

    두 개의 개별 스트림에 stdout 및 stderr 표시

  14. 14

    Bash 스크립트 및 stdin

  15. 15

    bash 스크립트 내에서 타임 스탬프가있는 파일에 stdout과 stderr을 모두 복사하는 방법은 무엇입니까?

  16. 16

    stdout 및 stderr을 파일로, stderr을 stdout으로 리디렉션

  17. 17

    stdout과 stderr을 bash 스크립트 내에서 파일로 리디렉션하는 방법은 무엇입니까?

  18. 18

    azure-ml에서 R 스크립트 디버깅 : stdout 및 stderr 로그는 어디에서 찾을 수 있나요? (또는 왜 비어 있습니까?)

  19. 19

    Redirect stdout and stderr when ampersand(&) is used between commands in bash

  20. 20

    lftp, stdout, stderr 및 SAP exec_protocol

  21. 21

    PowerShell 결합 및 로그 Stderr / Stdout

  22. 22

    STDIN, STDOUT, STDERR 및 반환 값 정보

  23. 23

    파일에 stderr 및 stdout 추가

  24. 24

    GNU 병렬 정렬 stdout 및 stderr

  25. 25

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

  26. 26

    Bash 스크립트 및 프로세스

  27. 27

    프로세스 ID가 제공된 프로세스의 stderr 및 stdout보기

  28. 28

    내 Django 앱에서 Celery의 하위 프로세스 stdout 및 stderr에 액세스

  29. 29

    함수 및 트랩 종료 신호에 stderr / stdout 메시지 보내기

뜨겁다태그

보관