2012-03-28 13 views
5

Bunu yapmak için geçerli bir yol olup olmadığını bilmiyorum. Ancak, her zaman mümkün olup olmadığını görmek istedim.pushd popd genel dizin yığını?

Pushd, popd ve dir'lerin yakın zamanda ziyaret ettiğiniz dizinler arasında kopyalama gibi birçok şey için yararlı olduğunu biliyorum.

Ancak, genel bir yığın tutabileceğiniz bir yolu var mı? Böylece bir terminalde bir şeyi (pushd kullanarak) basarsam, başka birine (belki sadece oturum açma oturumundaki terminallere) yansır.

+0

Pushd ve popd yerleşik komutlardır ve dir yığını her kabuk işlemi tarafından korunur. Evet, genel bir yığına sahip olmanın bir yolu var. Aslında birçok yol. Kendin bir şey denedin mi? –

cevap

4

Bunu bir çift kabuk işlevi ve geçici bir dosya ile yapabilmeniz gerekir.

Kişisel geçici dosya '/home/me/.directory_stack' gibi bir şey adının verileceğini ve basitçe dizinlerinin listesini içerecektir:

/home/me 
/etc 
/var/log 

Sizin 'push_directory' işlevi basitçe listeye geçerli dizin eklemek istiyorum. 'Pop_directory' işlevi listenin en son kapanmasını ve bu dizine geçiş yapacaktır. Yığının bu şekilde bir dosyada saklanması, bilginin tüm açık terminallerde (ve hatta yeniden başlatmalarda) mevcut olmasını sağlar.

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 
} 

sizin .bashrc de eklendiğinde bunlar otomatik olarak kabuk haline her giriş tanımlı olacak:

İşte bazı örnek fonksiyonları (sadece hafifçe test uyarısı) bulunmaktadır.

+0

Bah, sarnold'un benim yaptığım ve yumrukla dövdüğüm aynı düşünceye sahipmiş gibi görünüyor. Cevabımı farklı bir teknik kullandığı için bırakacağım, ancak kayıt için önce o oldu. – bta

+0

"Sed '$ p" ve "sed' $ d'" programları _perfect_; benim korkunç aritmetikten çok daha hoş. Standart Unix araçlarının bir dosyanın son satırını kaldırmak ve geri döndürmek için daha kolay bir mekanizmaya sahip olması gerektiğini düşündüm. – sarnold

3

Muhtemelen birkaç kabuk işlevi yazmak ve bunları pushd ve popd yerine kullanmak isteyeceksiniz. Eğer döner ve dosyanın son satırını kaldırır küçük bir program yazarsanız

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 } 

Sen çirkin bit bazı kurtulmak olabilir: Aşağıdaki (denenmemiş) fonksiyonları gibi bir şey çok işe yarayabilir.

+0

Teşekkürler! Bu hızlı ve basit görünüyor. Gerekirse bunu python/perl'de çoğaltmaya çalışacağım. Başlangıçta, bash'ın bunu yapmak için bir ortam değişkeninin olup olmadığını düşünüyordum. Sanırım bu durum böyle değil. –

+0

Bunu Python veya Perl'de yeniden yapmaya çalışmakla ilgili sorun, 'chdir (2)' sistem çağrısının yalnızca mevcut işlemi etkileyebileceğidir. Bunu Python'da gerçekten istiyorsanız, [IPython] 'a da bakmak isteyebilirsiniz (http://ipython.org/) - Anladığım kadarıyla, etkileşimli bilgi işlem görevleri için bir kabuk değiştirmeye çalışır. Ancak eğer kabuğunuzu kullanmaya devam etmek istiyorsanız, bu işlevleri başka bir dilde yeniden üretmeye çalışırken zaman kaybetmeyin - [bta'nın cevabı] (http://stackoverflow.com/a/9916812/377270) muhtemelen en iyisidir Çok fazla iş yapmadan yapabilirsin. – sarnold