Uzun bir yol için nasıl "takma ad" yapılır?


95

Kabuk komut dosyası oluştururken sıklıkla kullandığım bir yol için "takma ad" yapmaya çalıştım. Bir şey denedim ama başarısız oldu:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

Nasıl çalıştırırım?
Ancak cd ~/Files/Scripts/Mainçalışır.

Yanıtlar:


121

Bir ortam değişkeni olduğundan (diğer ad, içinde farklı bir tanıma sahiptir bash), aşağıdaki gibi bir şeyle değerlendirmeniz gerekir:

cd "${myFold}"

veya:

cp "${myFold}/someFile" /somewhere/else

Ama ben gerçekten daha kolay buluyorum, eğer sadece o dizine geçmenin kolaylığını istiyorsanız, gerçek bir takma ad oluşturmayı ( bashgibi başlangıç ​​dosyalarından birinde .bashrc), böylece tuş vuruşlarını kaydedebilirim:

alias myfold='cd ~/Files/Scripts/Main'

O zaman (olmadan cd) kullanabilirsiniz:

myfold

Tanımdan kurtulmak için kullanırsınız unalias. Aşağıdaki konuşma metni, bunların tümünü eylem halinde gösterir:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found

Teşekkürler. Bu işe yarıyor. Yalnızca myfold = '~ / some / path' takma adını denedim ve benimfold'umu cd. Bir hata alıyorum - böyle bir dizin yok. Neden ? Ayrıca, bir takma ad değişkeninin "atamasını geri almak" mümkün müdür?
bashboy

myfold = '~ / bir / yol' cd "$ myfold" Başarısız. Neden ?
bashboy

1
@başboy, muhtemelen bu isimde bir dizininiz olmadığı için. ~ / bir / yol bir örnekti, kullanmak istediğiniz gerçek yolu değiştirmelisiniz . Daha net olması için örnek dizininizi kullanacak şekilde değiştireceğim. Bir diğer adın atamasının nasıl kaldırılacağına gelince, unalias komutunu kullanırsınız. Yanıtı, bu komutun kullanımı da dahil olmak üzere bir konuşma metni ile güncelledim.
paxdiablo

Bu takma adı farklı terminal oturumlarında nasıl saklarsınız? Yeni bir sekme açıp bu takma adı kullanmaya çalıştığımda işe yaramıyor.
goldisfine

4
@goldisfine, parantezime bakın in one of the bash startup files like .bashrc. Takma adı uygun bir başlangıç ​​dosyasına koymak, tüm oturumlar için kullanılabilir olmasını sağlayacaktır .
paxdiablo

74

Bir kabuk seçeneği var cdable_vars:

cdable_vars
Bu ayarlanırsa, cdyerleşik komutun bir dizin olmayan bağımsız değişkeninin, değeri değiştirilecek dizin olan bir değişkenin adı olduğu varsayılır.

Bunu şuraya ekleyebilirsiniz .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Tilde'yi $HOME; ile değiştirdiğime dikkat edin ; tırnaklar tilde genişlemesini engeller ve Bash dizin olmadığından şikayet eder ~/Files/Scripts/Main.

Şimdi bunu şu şekilde kullanabilirsiniz:

cd myFold

Gerek yok $. Aslında bütün mesele bu - diğer yanıtlarda gösterildiği gibi cd "$myFold", kabuk seçeneği olmadan çalışır. cd myFoldAyrıca, içindeki yol myFoldboşluk içeriyorsa çalışır , alıntı gerekmez.

Bu, genellikle kontrollerdeki _cdişlev ayarlıysa , sekme otomatik tamamlama ile bile çalışır - ancak her uygulama bunu aynı şekilde yapmaz, bu nedenle yeniden kaynak oluşturmanız (veya kabuk seçeneğini ayarlamak için düzenlemeniz) gerekebilir .bash_completioncdable_varsbash_completion.bashrc/etc/profile


Diğer kabukların da benzer seçenekleri vardır, örneğin Zsh ( cdablevars).


1
ZSH için bunun bir eşdeğeri var mı?
Ryan Stull

1
@RyanStull setopt cdablevarsolabilir gibi görünüyor, ama zsh'ı hiç bilmiyorum.
Benjamin W.

@JohnMee, düzenlemenizi geri alacağım, çünkü a) seçenek zsh'de farklı şekilde adlandırılıyor (alt çizgi yok) b) sadece Bash etiketli soru ve c) Bash kılavuzuna bağlantı oluşturuyorum. Yine de diğer kabuklardan bahsetmek için bir paragraf ekleyeceğim.
Benjamin W.

1
Harika bir cevap! Çok teşekkür ederimcdable_vars
Lucas P.

1
@Vladislav ( ) işlevini cdkullanan bash-tamamlama tarafından sağlanan tamamlamayı bozduğuna dikkat edin . Buna eklemek (değişkenleri tamamlamak için) işe yarıyor, ancak istenmeyen yan etkilere neden olabilir - benim için sekme tamamladığımda tüm ortamımı gösteriyor. _cdcomplete -o nospace -F _cd cd-v
Benjamin W.

10

Belki bağlantı kullanmak daha iyidir

Yumuşak Bağlantı

Sembolik veya yumuşak bağlantı (dosyalar veya dizinler, daha esnek ve kendi kendini belgeleyen)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Sabit Bağlantı

Sabit bağlantı (yalnızca dosyalar, daha az esnek ve kendi kendine belgelenmeyen)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Bir dizine bağlantı nasıl oluşturulur

İpucu : Bağlantıyı evinizde görmeniz gerekmiyorsa, bir noktayla başlayabilirsiniz. ; o zaman varsayılan olarak gizlenecek ve buna benzer şekilde erişebilirsiniz

cd ~/.myHiddelLongDirLink

9

Bash'inizin hashtable'ına istediğiniz herhangi bir yolu ekleyebilirsiniz:

hash -d <CustomName>=<RealPath>

Şimdi yapabileceksiniz cd ~<CustomName>. Kalıcı hale getirmek için onu bashrc betiğinize ekleyin .

Bu hashtable'ın, bir komut her çalıştırıldığında içeriği aramasına gerek kalmaması için bash için bir önbellek sağlaması amaçlandığına dikkat edin, bu nedenle bu tablo, önbelleği geçersiz kılan olaylarda, örneğin değiştirme, temizlenecektir $PATH.


2
Bence sadece işe yarayacak zshama içinde olmayacak bash.
sergej

Bu en iyi cevap IMHO, ama zshsadece benim Ubuntu sistemimde çalıştığı doğru .
John Stewart

6

Öncelikle, teklifleri kaldırmanız gerekir:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Tırnaklar, kabuğun tilde'yi $HOMEdizininiz olma özel anlamına genişletmesini engeller .

Daha sonra $myFolderbir ortam bir kabuk değişkeni kullanabilirsiniz:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Bir takma ad oluşturmak için takma adı tanımlamanız gerekir:

alias myfolder="cd $myFolder"

Daha sonra bu tür bir komut gibi davranabilirsiniz:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$

Siz yapmadıkça aslında bir ortam değişkeni değildir export.
Keith Thompson

1
@KeithThompson Tamam, bu sadece bir kabuk değişkeni . Ancak, onu dışarı aktarmak istemezsiniz çünkü alt işlemleri etkilemesini istemezsiniz. Onu bu şekilde .bashrcveya kullandığınız kaynak dosyasında tanımlarsınız ve hemen kabukta tanımlanır, ancak kabuk komut dosyalarında tanımlanmaz.
David W.

Otomatik tamamlama ile çalıştığı için bu çözümleri tercih ediyorum
Vassilis

5

İlk olarak, $sorudaki kodun çalışması için "MyFold" değerine erişmeniz gerekir :

cd "$myFold"

Bunu basitleştirmek için şurada bir takma ad oluşturursunuz ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

Diğer .bashrcadı mevcut bash oturumunda kullanılabilir hale getirmek için bir kez kaynak almayı unutmayın :

source ~/.bashrc

Şimdi aşağıdakileri kullanarak klasöre geçebilirsiniz:

cdmain

4

Başka bir seçenek de sembolik bir bağlantı kullanmak olabilir. yani:

ln -s ~/Files/Scripts/Main ~/myFold

Bundan sonra aşağıdakiler ~/myFoldgibi işlemler gerçekleştirebilirsiniz :

cp some_file.txt ~/myFold

hangi dosyayı koyacaktır ~/Files/Scripts/Main. rm ~/myFoldOrijinal dizini koruyacak olan sembolik bağlantıyı istediğiniz zaman kaldırabilirsiniz .


Bir dezavantajı: Eğer cd myFoldöyleyse pwd, benimFold'da olduğunuzu gösterecektir. Bu benim için bir anlaşma kırıcı çünkü p4 kaynak kontrolü ile ilgili komutlar mevcut dizine bağlı.
Kullanıcı5910

1
@ User5910 - kullanımpwd -P
dvj

2

ancak bir dizin için gerçek bir takma ad da mümkündür, deneyin

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

Bu şekilde ortak bir adlandırma kuralınız olur (her bir dizin / diğer ad çifti için) ve mevcut dizinden myScripts'e bir şey kopyalamanız gerekirse, bunun hakkında düşünmeniz gerekmez.

IHTH


1

Denediğim önceki yanıtlar, takma ad dizininin alt dizinlerinin otomatik olarak genişletilmesine (otomatik tamamlama) izin vermiyor.

Bununla birlikte, takma ad vermek istediğiniz dizini dirsyığına iterseniz ...

$ pushd ~/my/aliased/dir

... daha sonra dirs -vyığındaki sayısal konumunu görmek için yazabilirsiniz :

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

ve bir dizin parametresi bekleyen tüm komutlar olmasa da çoğu için bu numarayı kullanarak ona bakın:

 $ mv foo.txt ~0  

Tab"Aliased" dizinin hemen alt dizinlerini göstermek için bile kullanabilirsiniz :

 $ cd ~0/<Tab>
 child_dir1    child_dir2

-1

Aşağıdaki satırı myscript’inize koyun

set myFold = '~/Files/Scripts/Main'

Terminal kullanımında

source myscript
cd $myFold
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.