答案:我的问题是$ {DIRSTACK [0]}保留文字〜,而$ {DIRSTACK [@]:1}没有。当我打电话给sort
时,我在重新排列顺序,然后移动到哪个DIRSTACK元素$ {DIRSTACK [0]}都不能与推+元素一起使用。我不通过在$ HOME / .logs / dirstack中记录$ {DIRSTACK [0]}来解决此问题,因此它永远不会重新排序到另一个索引。此错误已在October 2017中报告,并将在bash> 4.4的某些版本中修复。
原始问题
因此,我试图编写一个pushd
函数,该函数可以1)从pushd
中删除重复项(因为bash没有dunique
),并且2)在< em> all 终端,这意味着我必须写入文件。
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/docker
或cd ~/jenkins/docker
没有问题。