bash - 如何递归退出嵌套shell?
问题描述
我使用终端中的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
}
按大写 Q退出 ranger,之后 shell 会自动将目录同步到 ranger 中的同一目录。
这非常灵活,您可以使用它q来正常退出,而无需将 dir 同步回 shell。
更新:
. ranger
打开游侠是另一种解决方案,不推荐。因为与以前的方法相比,退出. ranger
withq将始终将 dir 从 ranger 同步回 shell。您无法控制此行为。
对此没有真正的解决方案。它经常被要求,但并不像人们想象的那么容易。您可以采购游侠,所以像这样开始
. ranger
。退出时将 cd 到游侠的 cwd。
参考