Sembolik bir bağlantı için takma ad eşdeğeri mi?


18

Kendimi sık sık ana klasörümdeki birkaç dizin etrafında atlamak ve bunları yazmaktan yorulmak istiyorum. Geleneksel olarak sembolik bir bağlantı olacak daha hızlı bir yaklaşım istiyorum.

Ancak, ana dizinimi düzinelerce sembolik bağlantıyla karıştırmak istemiyorum. Bazı oluşturabilir ~/links/dizini ve yığılmayı bunu sembolik bağlantıları ile, ama yine de çirkin. Ayrıca, her gün değişen (.bashrc içinde tanımlanmış) sembolik bağlantılar oluşturmak isteyebilirim.

Hızlı gezinme için bir bağlantı olarak tanınacak, ancak lsana dizini yaptığımda görünmeyecek ve geçerli oturumun ötesine geçmeyecek bir şey oluşturarak, sembolik bir bağlantıyı etkili bir şekilde takma adının bir yolu var mı ?


4
pushd ve popd içine bakmak isteyebilirsiniz
Rui F Ribeiro

Jeroen Janssen'in bu ihtiyaç için uyarlanabilir ve düşük maliyetli yaklaşımını buluyorum: jeroenjanssens.com/2013/08/16/…
Theophrastus

2
Hangi kabuğu kullanıyorsun?
Gilles 'SO- kötü olmayı bırak'

@Theophrastus Heh - temelde cevabımda o kadar zarif değil, yeniden uyguladım.
mattdm

3
tam olarak aradığınız şey değil, ancak iki yönetmen arasında ileri geri atlarken hala kullanışlı olabilir: son dizine cd -irade cdönceden vardı. Bu nedenle, iki kez yaparsanız, başladığınız yere geri dönersiniz ... durum için çok güzel "oh, önceki konumda someFile.txt dosyasını düzenlemeyi unuttum" => Basitçe:, cd -someFile.txt cd -
dosyasını

Yanıtlar:


12

Sekme tamamlamayı kullanabilirsiniz. Varsayılan olarak birçok Linux dağıtımında, bash [TAB] tuşuna bastığınızda olası eşleşmelerin bir listesi verilir veya yalnızca bir eşleşme varsa tümü doldurulur. Cd için, bu normalde geçerli çalışma dizininin alt dizinlerinin listesidir. Bunun üzerine yazabilirsiniz, ancak bunun yerine jd"atlama dizini" gibi bir takma ad oluşturmanızı öneririm :

alias jd=cd

ve sonra jd için tamamlama olarak istediğiniz "yer imlerini" tanımlayın. Çok fazla seçenek için bash adam sayfasına bak (dahil otomatik olarak oluşturarak bir komut veya işlevinden anında sonuçları), fakat en kolay yolu ile kelimeler, sadece bir listesidir -W:

komple -W "/ srv / www ~ / tmp ~ / work" jd

Şimdi jd[TAB] yazıp tıklayın, "yer işaretlerinizi" görürsünüz. Belirsiz bir parça yazın ve ardından tamamlamak için [SEKME] 'ye basın. (Yukarıda, ~s ana dizinime genişler, böylece ilk [SEKME] bana bir verir /ve eğer wtekrar vurursam ve [SEKME] /srv/wwwdoldurulur.)

Tabii ki, ~/.bash_profiledevam ettirmek için bunu koy .

Veya bunu bir sonraki seviyeye taşıyabiliriz. Bir dizin olun ~/.shortcuts- bir nokta ile başlayan, bu gizli ve güzel temiz ana dizini muss değil olacak - yani istediğiniz dizin sembolik ile ve dolguyu. Ardından, bunu ~ / .bash_profile dosyanıza koyun :

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

Bu, _list_shortcutsad listesini oluşturmak için jdişlevde biraz daha karmaşık bir tamamlamayı tanımlar ve basit bir takma addan ziyade basit bir takma addan ziyade bir işlev olmasını sağlar cd. -Pİçin bayrak cdyapar o sembolik çözmek, yani her şey şeffaf sihirli olur. Kısayol adlarınızın hedeflerle eşleşmesi bile gerekmez.

Yani:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

Ekstra bir fantezi için, jdherhangi bir parametre olmadan yürütüldüğünde tüm kısayollarınızı listeleyin:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

Not: Bunun compgen -W $( cmd )yerine kullanıyorum compgen -C 'cmd'çünkü ikincisi benim için hiç çalışmıyor ve nedenini anlamıyorum. Bu yeni bir soru olabilir. :)


çok ilginç. Bir yakalama olsa da, jd ile tamamlayabilmem için hala tam bağlantıyı veya en azından belirsiz olmayan bağlantıyı yazmayı gerektirir. Kısaltmak için jd komutlarına takma ad eklemenin herhangi bir yolu var mı? ya da sanırım sembolik linkleri saklayabileceğim bir dizine göreceli yapmak.
dsollen

@dsollen Güncellemeye bakın :)
mattdm

bu mükemmel çalıştı. Dürüst olmak gerekirse, bu soruya iyi bir cevap beklemiyordum, ama bu tam olarak istediğim şeydi. Bunun biraz kullanımını tahmin ediyorum ve yeni bir VM aldığımda değiştirdiğim şeylerin listesine eklemek için yeterince temiz geliyor (hatta yeni bir vm lol'a standart çevresel değişikliklerimi klonlamak için otomatik bir yolum var). Çok teşekkürler. Daha fazla boş zamanım olduğunda bir noktada COMPREPLY sözdiziminin nasıl çalıştığını
anlayacağım

18

Kabuk takma adları, (bazılarına) ad tamamlama (genellikle bağlı) yapabileceğiniz bir özelliğe sahiptir tab. Alternatif olarak, CDPATHadın tamamlanmasını desteklemek için "son zamanlarda" (son 5-6 yıl içinde) geliştirilmiş olan özelliği kullanabilirsiniz . Bu sizin için işe yararsa, yazdığınız şeyin dizinin bir anımsatıcı yerine gerçek adı olması avantajına sahiptir.

Bash el kitabına göre

CDPATH
cdYerleşik komut için arama yolu olarak kullanılan iki nokta üst üste işaretli dizinlerin listesi .

Daha fazla okuma:


CDPATHÇevre değişkenini bilmiyordum , teşekkür ederim. git_repos
Wildcard

16

Sık sık kullandığınız ancak günlük olarak değiştirmediğiniz dizinler için, başka bir seçenek yalnızca dosyanızda birkaç aliaskomut bulunmasıdır .bashrc:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

Bir arkadaşın bunlardan yaklaşık 50 tanesi vardır; Bir avuç var; çabuk ve kolay. Sadece

cdo

dizini / u01 / app / oracle olarak değiştirmek için


Aslında. Bu mekanizmayı 1990'ların başından beri kullanıyorum.
wallyk

7

Ben tavsiye pushdve popd.

Şahsen ben geliştirme işi yaparken / kaynak kodu okurken, birden fazla dizin dahil olduğunda onları kullanışlı buluyorum.

Etkili bir dizin yapısı ( pushd) PUSH ve bir sonraki POP dizin komutu ( popd) alır bir yığın yapısı / LIFO uygular .

Yani, bir dir içindeyken, yapardınız:

pushd .

Ve geri almanız gerektiğinde,

popd

Dizinlere dönmek için birden çok pushd(lar) ı gerçekleştirebilir ve daha sonra ilgili popd(ler) i yapabilirsiniz .

Buraya bir link bırakacağım.

http://www.eriwen.com/bash/pushd-and-popd/


1
Çok fazla kullanmıyorum hariç, bu da kullandığım çözüm popd. Listemi dirs( pushdkomutlar tarafından doldurulur ) ziyaret etmek / çalışmak istediğim tüm dizinlerle dolduruyorum , o zaman koşuyorum pushd +1. Sonra, basit olan rehberlerden ben can döngüsü !puolan çok hızlı. (Not Ubuntu ve CentOS hem o pushdolduğunu sadece temiz olan o başlar yüklemek geçerli komuta pu.)
Joker

3

Bunları değişkeninize sadece değişken olarak koyabilirsiniz ~/.bashrcve sonra sadece bir $uzaktasınız.

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

Açık cevap değişkenler , kabukta dosya sistemindeki sembolik bağlantılara benzer şekilde başka şeyleri temsil eden sembolik şeyler.

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

İyi bir kabukta, Tabdeğişken isimleri tamamlamanıza yardımcı olur, bu da daha fazla yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.