如果,在我新创建的 bash 中,我这样做:
pushd foo
pushd bar
dirs -l -v
我会得到类似的东西
0 bar
1 foo
2 old_dir
如果我那么做
bash
dirs -l -v
我只得到
0 bar
screen
如果我使用而不是,也会发生同样的事情bash
。
如何在分叉的 shell 中维护目录堆栈?
答案1
这不能自动工作的原因是 ATOW 是一个已知的 bash bug,它会阻止导出数组变量(请参阅手册页中的 bug 部分)。不幸的是 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'