Bash 如何递归退出嵌套shell?

Bash 如何递归退出嵌套shell?,bash,shell,sh,zsh,Bash,Shell,Sh,Zsh,我使用终端中的文件管理器四处移动。每次我使用S命令进入一个新目录时,Ranger实际上是在启动一个新的shell。当我想关闭终端窗口时,我需要运行exit的次数与我使用Ranger更改目录的次数相同。是否有一个命令将为我递归运行exit,直到窗口关闭?或者更好的方法是使用不同的Ranger命令?不要输入子shell,只需退出Ranger并让shell将目录从Ranger同步回 功能测距仪{ 本地IFS=$'\t\n 本地tempfile=“$(mktemp-t tmp.XXXXXX)” 本地游侠

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

不要输入子shell,只需退出Ranger并让shell将目录从Ranger同步回

功能测距仪{
本地IFS=$'\t\n
本地tempfile=“$(mktemp-t tmp.XXXXXX)”
本地游侠命令=(
命令
护林员
--cmd=“map Q chain shell echo%d>”$tempfile“quitall”
)
${ranger_cmd[@]}“$@”
如果[[-f“$tempfile”]&&&[”$(cat--“$tempfile”)!=“$PWD”]];则
cd--“$(cat“$tempfile”)”返回
fi
命令rm-f--“$tempfile”2>/dev/null
}
capitalQ退出ranger,之后shell将自动将目录同步到ranger中的同一目录

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

更新

。ranger
打开ranger是另一种解决方案,不推荐使用。因为与以前的方法相比,退出
。ranger
和q将始终从ranger将dir同步回shell。你无法控制这种行为

没有真正的解决办法。它经常被要求,但不像人们想象的那么容易。 你可以找到ranger的源代码,所以像这样启动它
。测距仪
。那会在退出时cd到护林员的cwd

参考资料


    • @Simba感谢您的精彩回答和文档链接

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

      alias ranger=“.ranger”
      

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

      尝试使用ENTER输入目录ENTER在Ranger中打开目录,但我希望在shell中重新打开它。我早就知道这个解决方案。此解决方案的缺点是,使用
      q
      退出将始终将目录同步回shell。你根本无法控制这种行为。这也是本期中提供自定义函数方法的原因。我刚刚注意到,这使我的修复成为一个交易破坏者,我将继续,并将您的原始答案标记为正确,这将真正解决它。