はい問題発生シェルプロセスの未解決のシンボリックリンクを取得する必要があります。たとえば、シンボリックリンク~/link
-> が与えられた場合、~/actual
bash が を使用して開始された場合、 bash プロセスの外部から取得する必要があります。$PWD
~/link
得る解決するcwdは、lsof
またはを使用して/proc
呼び出すことができます。https://unix.stackexchange.com/a/94359/115410しかし、私はそれを得ることは不可能だと考え始めました。決めなかった道。
lsof -b
なしで試しましたが、readlink
ロギングはパスがとにかく試行されなかったことを示しますreadlink
。/proc/.../environ
で環境を読み取って解析することは可能ですが、PWD
速度が遅く、/proc
システムに存在しない可能性があり、プロセス環境を読み取ろうとするとセキュリティに影響を与える可能性があると思います。
私が修正しようとしている問題があるコードは次のとおりです。
exec('lsof -OPln -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => {
...
});
Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`);
答え1
現在の作業ディレクトリの論理値(論理的なcwd、「未分析のpwd」と呼ばれるもの)は、カーネルではなくシェルの内部概念です。カーネルは完全に識別されたパス(物理cwd)のみを記憶します。したがって、共通のシステムインタフェースを介して必要な情報を取得することはできません。シェルの協力を得なければなりません。
環境PWD
変数は、シェルが論理 cwd を子プロセスに転送する方法です。シェルが別のシェルを実行すると、親はPWD
論理cwdに設定され(プログラムが実行されるたびに実行されます)、子はPWD
値がPWD
合理的であることを確認し、そうであればそれを論理cwdとして使用して次に戻ります。物理CWD。$PWD
欠落しているか間違っている場合はcwdです。
観察する:
#!/bin/sh
mkdir /tmp/dir
ln -sf dir /tmp/link
cd /tmp/link
sh -c 'echo Default behavior: "$PWD"'
env -u PWD sh -c 'echo Unset PWD: "$PWD"'
PWD=/something/fishy sh -c 'echo Wrong PWD: "$PWD"'
rm /tmp/link
rmdir /tmp/dir
出力:
Default behavior: /tmp/link
Unset PWD: /tmp/dir
Wrong PWD: /tmp/dir
プロセス環境を読むことは、特定のセキュリティ関連の意味を持ちませんが、PWD
プロセスが開始されたときの値が何であるかを示します。処理後に別のディレクトリに変更すると、環境の値は関連しなくなります。シェルが別のプロセスを実行している場合は、必要なのは環境の値です。しかし、これが起こる唯一の方法は、実際にシェルに別のプロセスを実行させることです。
GUIが実行中のシェルのcwdを見つける一般的な方法は、シェルにそれを印刷させることです。場合によっては、この情報が必要で、シェル構成の最大制御権をユーザーに任せたい場合は、シェルがプロンプトを表示してコマンドを実行していることを確認してくださいpwd
。これは単純で、cshやFishなどの「エキゾチックな」シェルでも機能しますが、特殊な場合(改行文字を含むディレクトリ名など)ではあいまいです。シェル設定を調整できる場合は、プロンプトが表示されるたびに(PS1
多くのシェルの場合、現在のディレクトリを含める方法はさまざまです)、またはディレクトリを変更するとき(chpwd_functions
zshから)シェルにエスケープシーケンスを印刷させることができます。より侵入的な方法で他の殻を削除します)。
論理cwdのコンポーネントが移動または削除された場合、またはシンボリックリンクが他の場所を指すように変更されている場合、この値は無効になる可能性があります。一方、物理cwdは常に正確です。 (ディレクトリが削除された場合、andなどのすべてのプログラムが情報を取得するLinuxは、ターゲットがReportで終わる壊れたシンボリックリンクとして表示されます。) 。/proc/PID/cwd
ps
lsof
(deleted)
lsof