OLDPWDはエクスポートされ、すべてのサブスクリプトに渡されますが、bashはサブスクリプトの起動時に明らかにOLDPWDをクリアします。
$ cd /etc
$ cd
$ perl -e 'print "<$ENV{OLDPWD}>\n"'
</etc>
$ ksh -c 'echo "<$OLDPWD>"'
</etc>
$ bash -c 'echo "<$OLDPWD>"'
<>
$OLDPWDを添え字に使用しようとするたびに、別名またはpip添え字を生成したり、同じ値を持つ別の変数をエクスポートしたりする他の方法はありますか?
** 2015年11月26日更新 **
私はbashバグレポートを提出し、bash管理者Chet Rameyから次の答えを受けました。
下付き文字が始まると、bashがOLDPWDを消去するのはなぜですか?
新しいシェルには「古い作業ディレクトリ」がないためです。 CD経由で設定する必要があります。 CDを実行していない場合は、CDがありません。
シェルが現在のディレクトリに名前を付けるときにPWDを継承するかのようにディレクトリに名前を付けると、OLDPWDを継承するのは妥当であるため、次のbashバージョンではこれを試してみます。
答え1
これはおそらくずっと前にbashが最初に実装されたときの残りの動作ですOLDPWD
。 bash 2.03 alpha(1999)のリリースノートは、以前にエクスポートされたOLDPWD
変数ではなかったことを示します。エクスポートしないと、子プロセスはそれを継承しません。
Bashソースコードでこのブロックのコメントを見ると、この動作は意図的です。
/* According to the Single Unix Specification, v2, $OLDPWD is an
`environment variable' and therefore should be auto-exported.
Make a dummy invisible variable for OLDPWD, and mark it as exported. */
temp_var = bind_variable ("OLDPWD", (char *)NULL, 0);
VSETATTR (temp_var, (att_exported | att_invisible));
リリースノートには、POSIX.2 準拠のためにエクスポートされるものが記載されていますが、OLDPWD
リストには表示されません。シェル変数POSIXシェルの場合。説明に記載されています。cd
。これは、初期値を親プロセスから取得する必要があるかどうかには言及せず、特定の動作は必要ありません。
Bashのロギング機能ではないようです。コメントはほとんどありません。
- MacOSXのErlangにOLDPWDがありません。
- ...「OLDPWDが設定されていません」...、初期サブシェルを表す持つ
cd
事前設定されたコマンドはありません$OLDPWD
。