【问题标题】:How to recursively exit nested shells?如何递归退出嵌套shell?
【发布时间】:2020-01-14 02:51:29
【问题描述】:

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

【问题讨论】:

  • 尝试使用ENTER进入目录
  • ENTER 在 Ranger 中打开目录,但我希望在我的 shell 中打开它。

标签: bash shell sh zsh


【解决方案1】:

不要进入子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
}

按capital Q退出ranger,之后shell会自动同步目录到ranger中的同一个目录。

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

更新:

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

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

参考文献

【讨论】:

  • 非常感谢您提供此功能!使用S 进入所需的目录时,我一直错了。
【解决方案2】:

@Simba 感谢您的出色回答和文档链接。

最后,最简单的答案是在我的 .bashrc 中创建一个别名,就像文档推荐的那样

alias ranger=". ranger"

现在我用Q退出时会自动切换到新目录,只需要运行exit一次就可以关闭窗口。

【讨论】:

  • 我已经从issue 1554 知道了这个解决方案。此解决方案的缺点是,使用q 退出将始终将目录同步回shell。而且您根本无法控制这种行为。这也是本期提供自定义函数方法的原因。
  • 我刚刚注意到,这使我的解决方案破坏了交易,我会继续并将您的原始答案标记为正确,这样可以真正解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2015-12-27
  • 2017-08-15
  • 1970-01-01
  • 2020-06-04
  • 2012-08-10
相关资源
最近更新 更多