新しく作成された bash で次のことを行う場合:
pushd foo
pushd bar
dirs -l -v
私は次のようなものを取得します。
0 bar
1 foo
2 old_dir
私がそうすれば
bash
dirs -l -v
私はただ得る
0 bar
screen
代わりに使用しても同じことが起こりますbash
。
分岐シェルでディレクトリスタックを維持する方法は?
答え1
これが自動的に機能しないのは、ATOWが配列変数のエクスポートを防ぐ既知のbashバグであるためです(マンページのバグセクションを参照)。残念ながら、DIRSTACKは配列変数です。
私はPushd / popd / dirsをラップしますが、その内容を子プロセスが知ることができるように、スカラー変数に保存する代替案を作成しました。
以下のコードを取得し、元のコードの代わりにmypushd / mypopd / mydirsを使用すると、子プロセスは親プロセスのスタックを覚えています。名前にコロンが含まれているディレクトリでは、この機能は機能しません。
エラーが見つかったら、私が書いたばかりなので、教えてください。また、より簡単な選択肢をご存知であれば、共有してください!
export SCALARDIRSTACK
export DIRSTACK
update_dirstack()
{
if [ ! -z "$SCALARDIRSTACK" ]; then
dirs -c
# get an array from scalardirstack
IFS=':' read -a tmp <<< "$SCALARDIRSTACK"
# traverse in reverse order to pushd stuff into the stack
for (( idx=${#tmp[@]}-1 ; idx>=0 ; idx-- )) ; do
# gotta use pushd/popd this to manipulate DIRSTACK
pushd -n ${tmp[idx]} > /dev/null
done
fi
}
update_scalardirstack()
{
if [ ${#DIRSTACK[@]} -gt 1 ]; then
SCALARDIRSTACK=$(printf '%q:' ${DIRSTACK[@]:1}) # string from array
else
SCALARDIRSTACK=""
fi
}
scalar_dstack_wrap()
{
update_dirstack
$@
update_scalardirstack
}
alias mydirs='scalar_dstack_wrap dirs'
alias mypushd='scalar_dstack_wrap pushd'
alias mypopd='scalar_dstack_wrap popd'