保存Bash注销上的最后一个工作目录

时间:2009-04-20 05:46:44

标签: bash shell

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

6 个答案:

答案 0 :(得分:17)

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

pwd > ~/.lastdirectory

使用

在〜/ .bashrc中读取此文件
[ -s ~/.lastdirectory ] && cd `cat ~/.lastdirectory`

答案 1 :(得分:8)

把它放在~/.bashrc(可能在最后):

cd "$(<~/.storepwd)"

然后您可以选择以下内容:

将其放在~/.bash_logout中(不记得交互式非登录shell的目录):

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

或者在trap上使用EXIT,将其放在~/.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

答案 2 :(得分:2)

您还需要小心这整个概念。例如,如果您设法在不期望的情况下运行代码,则可能会混淆任何数量的内容。

例如,如果您要运行一个更改当前工作目录的shell脚本,然后在退出期间设法保存其CWD,您可能会在启动的下一个shell中以一个目录结束不要指望。

另一个流行的,至少对我来说是$ work,就是当一个脚本运行时,你的用户运行一个脚本,所有这些都是自动的(即以编程方式)。如果您正在为自己的用户执行此CWD技巧,那很好,但它可能主要搞砸了系统工具,期望“su - youruser -c ls”返回主目录中的文件。 (好吧,将“ls”称为你的用户是一个愚蠢的想法,但有些事情你的用户可能有比root更好的运行环境 - 例如,在已经压缩根的NFS挂载上。)

所以,这里的关键是判断你是否在交互式shell中,如果没有,不会恢复或保存你的CWD 。 IIRC,$ - 有一个'i'用于互动外壳。用它来设置陷阱和恢复CWD。

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

alias go='. go.sh'

然后go.sh只是检查我想要去哪个目录的参数。例如,“go myproj”将cd~ / svn / myproj,“go bigdisk”将cd / mnt / bigdisk。并且,对于更复杂的情况,它可能需要更多参数,例如,“go myproj lib”只是“cd~ / svn / myproj / myproj / lib”或者其他什么。没有自动保存,但也没有副作用。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

查看.bashrc,也许能够在注销时修改它以包含您感兴趣的目录。

答案 5 :(得分:0)

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

  1. 在〜/ .bash_logout中添加一些代码。这只会在登录shell退出时执行,因此如果您只是关闭终端窗口,则不会保存该目录。
  2. 陷阱退出。使用内置的“陷阱”,可以在shell退出时执行一些代码。这将在任何shell退出时运行 - 好吧,你设置陷阱的任何shell,即。
  3. 您可以在每次提示时保存CWD,或者每次运行'cd'时保存CWD,但这有点矫枉过正。

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

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