【问题标题】:Save last working directory on Bash logout在 Bash 注销时保存最后一个工作目录
【发布时间】:2009-04-20 05:46:43
【问题描述】:

在 bash 中“退出”时是否可以保存最后一个工作目录。因此,下次您登录时,它将位于您上次注销时所在的目录。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    将~./.bash_logout 中的最后一个工作目录保存到隐藏文件中:

    pwd > ~/.lastdirectory
    

    在 ~/.bashrc 中读取这个文件

    [ -s ~/.lastdirectory ] && cd `cat ~/.lastdirectory`
    

    【讨论】:

    • 如果你正确引用你的扩展,测试是没有必要的。
    • 应该是~/.bash_logout(~和/之间没有.)而不是~./.bash_logout?
    • 这在 2021 年不起作用:.lastdirectory: Permission denied
    【解决方案2】:

    把这个放在你的~/.bashrc(可能在最后):

    cd "$(<~/.storepwd)"
    

    那么您可以选择以下选项:

    要么把它放在~/.bash_logout 中(不会记住交互式非登录 shell 的目录):

    printf %s "$PWD" > ~/.storepwd
    

    或在EXIT 上使用trap,将其放入您的~/.bashrc(陷阱可以轻松/意外地覆盖):

    trap 'printf %s "$PWD" > ~/.storepwd' EXIT
    

    或者使用PROMPT_COMMAND,把这个放到你的~/.bashrc(可能是最可靠的方式):

    PROMPT_COMMAND+='; printf %s "$PWD" > ~/.storepwd'
    

    还要确保您的 ~/.profile~/.bash_profile 来源您的 ~/.bashrc,否则登录 shell 启动时路径将无法恢复。

    请参阅http://mywiki.wooledge.org/DotFiles,了解有关如何使用点文件的信息。

    【讨论】:

      【解决方案3】:

      您还需要谨慎对待整个概念。例如,如果你设法让你的代码在你不期望的时候运行,它可能会混淆很多事情。

      例如,如果您要运行一个更改当前工作目录的 shell 脚本,然后在退出期间设法保存它的 CWD,那么您可能会在下一个启动的 shell 中进入您指定的目录。不要期待。

      另一个流行的,至少对我在 $work 来说,是当 root su 向您的用户运行脚本时运行脚本,所有这些都是自动的(即,以编程方式)。如果您正在为自己的用户执行此 CWD 技巧,那很好,但它可能会严重破坏期望“su - youruser -c ls”返回主目录中的文件的系统工具。 (好吧,以您的用户身份调用“ls”是一个愚蠢的想法,但是在某些情况下,您的用户可能拥有比 root 更好的运行环境 - 例如,在 root 被压缩的 NFS 挂载上。)

      因此,这里的关键是判断您是否在交互式 shell 中,如果不是,不要恢复或保存您的 CWD。 IIRC,$- 有一个用于交互式 shell 的“i”。用它来设置陷阱和恢复 CWD。​​p>

      就我个人而言,我只是设置了一个别名:

      alias go='. go.sh'
      

      然后 go.sh 简单地检查它的参数,以确定我想去哪个目录。例如,“go myproj”将 cd ~/svn/myproj,“go bigdisk”将 cd /mnt/bigdisk。而且,对于更复杂的情况,它可以采用更多参数,例如,“go myproj lib”将只是“cd ~/svn/myproj/myproj/lib”或其他。没有自动保存,但也没有副作用。

      【讨论】:

        【解决方案4】:

        每次更改目录(cd)时,您都可以将当前目录(pwd)写入某个文件。启动终端时,bash 启动脚本应该在该文件中查找“最后一个目录”。如果发现了什么 - cd 到它。

        【讨论】:

          【解决方案5】:

          查看 .bashrc,也许可以在注销时对其进行修改以包含您感兴趣的目录。

          【讨论】:

            【解决方案6】:

            您很可能希望在 shell 退出时将当前目录保存到文件中。有多种方法可以检测 shell 退出:

            1. 在 ~/.bash_logout 中添加一些代码。这只会在登录 shell 退出时执行,因此如果您只是关闭终端窗口,则不会保存目录。
            2. 在 EXIT 上设置陷阱。使用内置的“trap”,您可以在 shell 退出时执行一些代码。这将在任何 shell 退出时运行 - 嗯,你设置陷阱的任何 shell。

            您可以在每次提示时保存 CWD,或者每次运行“cd”时保存 CWD,但这有点矫枉过正。

            要在下一个 shell 启动时恢复 CWD,只需在保存文件的内容(如果存在)上运行“cd”即可。

            您可能想考虑一下如果同时运行多个 shell 会发生什么。你想保存哪一个的CWD?是否应该所有开始使用该 CWD 的新 shell?还是只是下一个启动的 shell?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-12-10
              • 2022-11-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多