一部のシェル機能を実行して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
少し複雑ですが、権限と所有者との違いがあることをお知らせします。
明示的なリダイレクトがない場合、ターミナルログインセッションで実行されるプロセスには、同じ(端末)文字デバイスを参照する3つの記述子がすべてあります。ファイル記述子0と1は明確です。まだログインセッション内の端末デバイスに通常適用されるように、あなたが所有し、あなただけが読み書きできる端末文字デバイスを参照します。
標準エラーまだ「抑圧」されます。書き込み操作はまだ進行中であり、ユーザーが所有していないが書き込みアクセス権を持つ一種の文字デバイスに送信されます。ファイル記述子2で参照される文字デバイスはほぼ確実/dev/null
です。源泉標準エラーを/dev/null
次のスクリプトにリダイレクトする
2> / dev / nullを実行します。
fstat
そのため、知識を拡張することが何であるかを確認してから、リダイレクトしてください。
2>&1を実行