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少し複雑ですが、権限と所有者との違いがあることをお知らせします。

明示的なリダイレクトがない場合、ターミナルログインセッションで実行されるプロセスには、同じ(端末)文字デバイスを参照する3つの記述子がすべてあります。ファイル記述子0と1は明確です。まだログインセッション内の端末デバイスに通常適用されるように、あなたが所有し、あなただけが読み書きできる端末文字デバイスを参照します。

標準エラーまだ「抑圧」されます。書き込み操作はまだ進行中であり、ユーザーが所有していないが書き込みアクセス権を持つ一種の文字デバイスに送信されます。ファイル記述子2で参照される文字デバイスはほぼ確実/dev/nullです。源泉標準エラーを/dev/null次のスクリプトにリダイレクトする

2> / dev / nullを実行します。

fstatそのため、知識を拡張することが何であるかを確認してから、リダイレクトしてください。

2>&1を実行

おすすめ記事