새로 생성된 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'