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'

관련 정보