0

回答:我的问题是 ${DIRSTACK[0]} 包含文字 ~,而 ${DIRSTACK[@]:1} 不会。当我打电话sort时,我正在重新安排订单,然后移动到的任何 DIRSTACK 元素 ${DIRSTACK[0]} 都无法与 pushd +element 一起使用。我通过不在我的 $HOME/.logs/dirstack 中记录 ${DIRSTACK[0]} 解决了这个问题,这样它就永远不会被重新排序到另一个索引。此错误于2017 年 10 月报告,将在 bash >4.4 的某些版本中修复。

原始问题

所以我尝试编写一个pushd函数,它可以 1)删除重复项pushd(因为 bash 没有)和 2)在所有dunique终端中保留最后 10 个目录,这意味着我必须写入文件。

pd() {
    if [[ -f "$HOME/.logs/dirstack" ]]; then
        dirs -c
        s=($(sort "$HOME/.logs/dirstack" | uniq))
        for dir in "${s[@]}"; do
            pushd -n "$dir" >/dev/null
        done
    fi
    local choice="+$1"
    pushd $choice
    printf '%s\n' "${DIRSTACK[@]:0:10}" >"$HOME/.logs/dirstack"
}

所以,显然这个函数是愚蠢的,因为通过排序你真的不知道你正在cd进入哪个目录,但这更接近于一个最小的、可行的、完整的示例来显示问题。

大多数情况下,此功能不起作用,但有时会。失败时,它会显示如下错误:

j@pc$ pd 2
-bash: pushd: ~/jenkins/docker: No such file or directory

成功后,它将正确地进入该目录。失败与使用的特定目录无关。所有目录都存在,我可以pushd ~/jenkins/dockercd ~/jenkins/docker没有问题。

4

0 回答 0