首页 > 解决方案 > 如何递归退出嵌套shell?

问题描述

我使用终端中的Ranger文件管理器来移动。每次我使用S命令进入一个新目录时,Ranger 实际上是在启动一个新的 shell。当我想关闭终端窗口时,我需要运行exit与 Ranger 更改目录一样多的次数。是否有一个命令会exit为我递归运行,直到窗口关闭?或者更好的是是否有不同的 Ranger 命令可以使用?

标签: bashshellshzsh

解决方案


不要进入子shell,只需退出 ranger 并让 shell 从 ranger 同步回目录。

function ranger {
    local IFS=$'\t\n'
    local tempfile="$(mktemp -t tmp.XXXXXX)"
    local ranger_cmd=(
        command
        ranger
        --cmd="map Q chain shell echo %d > "$tempfile"; quitall"
    )

    ${ranger_cmd[@]} "$@"
    if [[ -f "$tempfile" ]] && [[ "$(cat -- "$tempfile")" != "$PWD" ]]; then
        cd -- "$(cat "$tempfile")" || return
    fi
    command rm -f -- "$tempfile" 2>/dev/null
}

大写 Q退出 ranger,之后 shell 会自动将目录同步到 ranger 中的同一目录。

这非常灵活,您可以使用它q来正常退出,而无需将 dir 同步回 shell。

更新

. ranger打开游侠是另一种解决方案,不推荐。因为与以前的方法相比,退出. rangerwithq将始终将 dir 从 ranger 同步回 shell。您无法控制此行为。

对此没有真正的解决方案。它经常被要求,但并不像人们想象的那么容易。您可以采购游侠,所以像这样开始. ranger。退出时将 cd 到游侠的 cwd。

参考


推荐阅读