2009-04-20 10 views

答えて

15

保存隠しファイルに〜./ bash_logoutの最後の作業ディレクトリ:。

pwd > ~/.lastdirectory 

があなたの~/.bashrcに入れ

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

拡張を適切に引用する場合は、テストは必要ありません。 – lhunath

+0

これは、〜/ .bash_logout(〜と/の間にある〜)ではなく、〜/ .bash_logoutでなければなりませんか? – Gnubie

1

dir(cd)を変更するたびに、現在のディレクトリ(pwd)をファイルに書き込むことができます。ターミナルを起動するとき、bashスタートアップスクリプトはそのファイルの "last dir"を探します。何かが見つかった場合 - それにcdしてください。

0

.bashrcのを見て、おそらくあなたが興味を持っているディレクトリが含まれているために、ログアウト時にそれを変更することができるという。

0

あなたが最も可能性が高い時にシェルが終了ファイルに現在のディレクトリを保存しておきたいです。シェルの終了を検出するには、いくつかの方法があります。

  1. 〜/ .bash_logoutにいくつかのコードを入れてください。これは、ログインシェルが終了したときにのみ実行されるので、端末ウィンドウを閉じるだけであれば、ディレクトリは保存されません。
  2. EXITでトラップします。組み込み関数 "trap"を使うと、シェルが終了したときにいくつかのコードを実行させることができます。これはシェルが終了したときに実行されます - あなたがトラップを設定したシェル、つまり。

すべてのプロンプトで、または「cd」を実行するたびにCWDを保存できますが、それはちょっと残酷です。

次回のシェルの起動時にCWDを復元するには、保存ファイルの内容に「cd」を実行するだけです。

複数のシェルを同時に実行している場合、どうなるべきか考えてみてください。どちらのCWDを保存しますか? CWDを使用する新しいシェルがすべて使用されるべきですか?または、起動する次のシェルだけですか?

6

これを〜/ .bashrcの中に、このファイルを読む(おそらく最後に:

cd "$(<~/.storepwd)" 

次に、次のいずれかを選択してください:

のどちらか(インタラクティブ非ログインシェル用のディレクトリを覚えていないだろう)~/.bash_logoutでこれを置く:

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

またはEXITtrapを使用し、あなたの~/.bashrcでこれを置く(トラップが簡単/誤って上書きすることができます) :

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

またはPROMPT_COMMANDを使用するには、あなたの~/.bashrc(おそらく最も信頼性の高い方法を)これを置く:

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

また、~/.profileまたは~/.bash_profileのソースが~/.bashrcであることを確認してください。そうしないと、ログインシェルの起動時にパスが復元されません。

ドットファイルの使用方法については、http://mywiki.wooledge.org/DotFilesを参照してください。

+0

+1これは受け入れられた答えよりもはるかにbash固有です。 –

2

この概念全体にも注意する必要があります。たとえば、期待していないときにコードを実行すると、さまざまなことを混乱させる可能性があります。

たとえば、現在の作業ディレクトリを変更したシェルスクリプトを実行し、終了時にCWDを保存するように管理した場合、起動する次のシェルでは、ディレクトリあなたは期待していません。

少なくとも私の仕事では、root suがユーザーにスクリプトを実行するときにスクリプトが実行されるときに、それはすべて自動的に(つまりプログラムで)実行されます。あなた自身のユーザのためにこのCWDトリックをやっているなら、それは問題ありませんが、 "su - youruser -c ls"があなたのホームディレクトリのファイルを返すことを期待するシステムツールに大いに悩まされるかもしれません。 (あなたのユーザーが気まぐれなアイデアだから、 "ls"と呼んでください。しかし、rootよりも優れた環境があるかもしれません。例えば、ルートが押しつぶされたNFSマウントの場合)。

Soここで重要な点は、対話シェルであるかどうかを確認することです。そうでない場合は、はCWDを復元または保存しません。 IIRC、$ - には対話シェルがあります。トラップの設定と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"などとなります。自動保存はありませんが、副作用はありません。

関連する問題