bash - 如何递归退出嵌套的shell?

标签 bash shell sh zsh

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

最佳答案

不要进入子 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 打开 ranger 是另一种解决方案,不推荐。因为与之前的方法相比,退出。带有 q 的 ranger 将始终将目录从 ranger 同步回 shell。您无法控制此行为。

No real solution to this. It's oft requested but not as easy as people think. You can source ranger, so start it like this . ranger. That'll cd to ranger's cwd when quitting.

引用资料

关于bash - 如何递归退出嵌套的shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57903114/

相关文章:

bash - 如何使 shell 脚本所做的更改永久生效?

mysql - 在 bash 脚本中将变量注入(inject)到 mysql 查询中

linux - 在 bash 中内联 if else 语句

linux - While 循环/if else 循环读取和验证 IP 地址

Git 提交后钩子(Hook)控制台日志

linux - 在所有启动过程后运行我的应用程序

php - 获取当前运行版本的 PHP 版本

bash - 在 Shell 中以相反顺序重命名文件

linux - Bash:从文件中读取时,剪切不会剪切第一行

bash - 如何使用 UNIX 工具对 "MON_YYYY_day_NUM"时间进行排序?