2012-03-28 1 views
5

これを行う有効な方法があるかどうかわかりません。しかし、常に可能性があるかどうかを見たいと思っていました。pushd popdグローバルディレクトリスタック?

pushd、popd、およびdirsは、あなたが最近訪れたディレクトリ間のコピーなどの多くの目的に役立つことは知っています。

しかし、グローバルスタックを維持する方法はありますか?そのため、ある端末で何か(pushdを使用して)プッシュすると、別の端末に反映されます(そのログインセッションの端末だけかもしれません)。

+0

Pushdとpopdは組み込みコマンドであり、dirスタックは各シェルプロセスによって維持されます。はい、グローバルスタックを持つ方法があります。実際には多くの方法があります。自分で何かしようとしましたか? –

答えて

4

これは、シェル関数とテンポラリファイルのペアで行うことができます。

あなたの一時ファイルを「/home/me/.directory_stack」のようなものという名前になり、単にディレクトリのリストが含まれます

/home/me 
/etc 
/var/log 

あなたの「push_directory」関数は、単にリストにカレントディレクトリを追加します。 'pop_directory'関数はリストから最新のものを取り出し、そのディレクトリに切り替えます。このようなファイルにスタックを格納することで、開いているすべての端末に情報が存在することが保証されます(リブートしても)。ここで

いくつかの例の機能(警告:のみ軽くテスト)されている

directory_stack=/home/me/.directory_stack 
function push_dir() { 
    echo $(pwd) >> $directory_stack 
    cd $1 
} 
function pop_dir() { 
    [ ! -s $directory_stack ] && return 
    newdir=$(sed -n '$p' $directory_stack) 
    sed -i -e '$d' $directory_stack 
    cd $newdir 
} 

は、あなたの.bashrcにそれを追加し、彼らは自動的にあなたがシェルにログインするたびに定義されます。

+0

バー、それはsarnoldが私がしたことと同じアイデアを持っているように見え、パンチに私を打ち負かす。私は別のテクニックを使用しているので、私は答えを残すでしょうが、記録のために彼は最初でした。 – bta

+0

'sed '$ p''と 'sed '$ d'プログラムは完全です。私のひどい算数よりもはるかに良い。私は、標準のUnixツールが、ファイルの最後の行を削除して返すためのより簡単なメカニズムを持つべきだと考えました... – sarnold

3

おそらく、いくつかのシェル関数を記述して、pushdpopdの代わりに使用したいと思うでしょう。あなたが戻って、ファイルの最後の行を削除する小さなプログラムを書く場合

mypushd() { echo "$1" >> ~/.dir_stack ; cd "$1" } 
mypopd() { dir=`tail -1 ~/.dir_stack` ; cd "$dir" ; 
      foo=`wc -l ~/.dir_stack | egrep -o '[0-9]+'` ; 
      ((foo=$foo-1)) ; 
      mv ~/.dir_stack ~/.dir_stack_old ; 
      head -n $foo ~/.dir_stack_old > ~/.dir_stack } 

あなたは醜いビットの一部を取り除くことができ、次の(未テスト)機能のようなものは、仕事をするかもしれません。

+0

ありがとう!これはすばやく簡単です。私は必要に応じてこれをpython/perlで複製しようとします。私は最初に、bash自体にこれを行うための環境変数があるかどうか考えていました。私はそうじゃないと思う。 –

+0

PythonやPerlでこれをやり直す際の問題は、 'chdir(2)'システムコールが現在のプロセスにしか影響しないということです。これをPythonで本当にしたいのであれば、[IPython](http://ipython.org/)を見てみることもできます。インタラクティブなコンピューティングタスクの代わりにシェルを使用しようとしています。しかし、シェルを使い続けたい場合は、これらの関数を他の言語で再現しようと時間を無駄にしないでください。[btaの答え](http://stackoverflow.com/a/9916812/377270)莫大な労力を費やすことなくやり遂げることができます。 – sarnold

関連する問題