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

分岐シェルでディレクトリスタックを維持する方法は?

答え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'

関連情報