bash - 继承子级中的目录堆栈

bash - 继承子级中的目录堆栈

如果,在我新创建的 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'

相关内容