stderr이 억제되는 이유를 디버깅하는 방법은 무엇입니까?

stderr이 억제되는 이유를 디버깅하는 방법은 무엇입니까?

일부 쉘 기능을 실행하고 Ctrl-C를 사용하면 표준 오류가 억제되어 echo hi >&2아무것도 echo hi > /dev/stderr인쇄되지 않습니다. 디버깅하고 싶은데 어떻게 시작해야 할지 모르겠습니다. stderr가 리디렉션되는 위치를 확인하는 방법은 무엇입니까? 영향을 받는 셸에서 실행해도 exec zsh문제가 해결되지 않습니다. 이는 문제가 실제로 악의적인 리디렉션으로 인해 발생했음을 나타냅니다.

저는 macOS를 사용하고 있습니다.

나는 시도했다:

ll /dev/fd
crw--w---- 0,11 evar 12 May 18:32 0
crw--w---- 0,11 evar 12 May 18:32 1
crw-rw-rw-  0,2 root 12 May 18:32 2

/dev/fd/2아마도 문제는 누가 그것을 소유하고 있는가 하는 것입니다 root.

고쳐 쓰다:

lsof -p $$
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF                NODE NAME
zsh     69568 evar  cwd    DIR    1,6      1472          8624004142 /Users/evar/Base/Lectures
zsh     69568 evar  txt    REG    1,6    618652          8678375637 /usr/local/Cellar/zsh/5.8/bin/zsh
zsh     69568 evar  txt    REG    1,6    452676          8677805768 /usr/local/Cellar/pcre/8.44/lib/libpcre.1.dylib
zsh     69568 evar  txt    REG    1,6    312924          8678370072 /usr/local/Cellar/ncurses/6.2/lib/libncursesw.6.dylib
zsh     69568 evar  txt    REG    1,6    251160          8678375669 /usr/local/Cellar/zsh/5.8/lib/zsh/zle.bundle
zsh     69568 evar  txt    REG    1,6    123012          8678375645 /usr/local/Cellar/zsh/5.8/lib/zsh/complete.bundle
zsh     69568 evar  txt    REG    1,6     65188          8678375676 /usr/local/Cellar/zsh/5.8/lib/zsh/compctl.bundle
zsh     69568 evar  txt    REG    1,6     18220          8678375661 /usr/local/Cellar/zsh/5.8/lib/zsh/terminfo.bundle
zsh     69568 evar  txt    REG    1,6     27888          8678375680 /usr/local/Cellar/zsh/5.8/lib/zsh/system.bundle
zsh     69568 evar  txt    REG    1,6     17240          8678375681 /usr/local/Cellar/zsh/5.8/lib/zsh/langinfo.bundle
zsh     69568 evar  txt    REG    1,6     38064          8678375656 /usr/local/Cellar/zsh/5.8/lib/zsh/parameter.bundle
zsh     69568 evar  txt    REG    1,6     22864          8678375674 /usr/local/Cellar/zsh/5.8/lib/zsh/pcre.bundle
zsh     69568 evar  txt    REG    1,6     37588          8678375667 /usr/local/Cellar/zsh/5.8/lib/zsh/zutil.bundle
zsh     69568 evar  txt    REG    1,6     62316          8678375647 /usr/local/Cellar/zsh/5.8/lib/zsh/complist.bundle
zsh     69568 evar  txt    REG    1,6     22620          8678375675 /usr/local/Cellar/zsh/5.8/lib/zsh/stat.bundle
zsh     69568 evar  txt    REG    1,6     29076          8678375649 /usr/local/Cellar/zsh/5.8/lib/zsh/zpty.bundle
zsh     69568 evar  txt    REG    1,6     18736          8678375668 /usr/local/Cellar/zsh/5.8/lib/zsh/datetime.bundle
zsh     69568 evar  txt    REG    1,6     17628          8678375660 /usr/local/Cellar/zsh/5.8/lib/zsh/zleparameter.bundle
zsh     69568 evar  txt    REG    1,6     18208          8678375654 /usr/local/Cellar/zsh/5.8/lib/zsh/termcap.bundle
zsh     69568 evar  txt    REG    1,6     63728          8678375662 /usr/local/Cellar/zsh/5.8/lib/zsh/computil.bundle
zsh     69568 evar  txt    REG    1,6     22440          8678375673 /usr/local/Cellar/zsh/5.8/lib/zsh/sched.bundle
zsh     69568 evar  txt    REG    1,6   1534352 1152921500311885154 /usr/lib/dyld
zsh     69568 evar    0u   CHR  16,11   0t56261                3469 /dev/ttys011
zsh     69568 evar    1u   CHR  16,11   0t56261                3469 /dev/ttys011
zsh     69568 evar    2w   CHR    3,2 0t1314232                 314 /dev/null
zsh     69568 evar   10u   CHR  16,11   0t21049                3469 /dev/ttys011
zsh     69568 evar   11u   CHR   15,9    0t9086                 583 /dev/ptmx

답변1

정보를 얻는 일반적인 방법은 일반적인 BSD 명령입니다.

fstat -p $$
그러나 귀하의 목록은 /dev/fd파일 설명자 2가 파일 설명자 0과 1이 연결된 터미널 문자 장치에 연결되어 있지 않다는 것을 알려주기에 충분합니다. 아래 파일의 주 번호와 부 번호는 /dev/fd약간 복잡하지만 권한 및 소유자와 함께 차이가 있음을 알려줍니다.

명시적인 리디렉션이 없으면 터미널 로그인 세션에서 실행되는 프로세스는 동일한 (터미널) 문자 장치를 참조하는 세 가지 설명자를 모두 갖게 됩니다. 파일 설명자 0과 1은 명확합니다.아직로그인 세션 내의 터미널 장치에 일반적으로 적용되는 것처럼 귀하가 소유하고 귀하만 읽고 쓸 수 있는 터미널 문자 장치를 참조합니다.

표준 에러아직 아님"억압"됩니다. 쓰기 작업은 여전히 ​​진행 중이며 사용자가 소유하지는 않지만 쓰기 액세스 권한이 있는 일종의 문자 장치로 전송됩니다. 파일 설명자 2에서 참조하는 문자 장치는 거의 확실 /dev/null하며원천표준 오류를 /dev/null다음과 같은 스크립트 로 리디렉션

2>/dev/null을 실행합니다.

fstat따라서 지식을 확장하라는 내용이 무엇인지 확인한 후 다시 리디렉션하세요.

2>&1을 실행

관련 정보