일부 쉘 기능을 실행하고 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을 실행