',,' '...' takma adı olabilir mi?


41

Bazen, ana dizine geçmek istediğimde, cd ,,bunun yerine yanlışlıkla yazıyorum cd ... Bu ifadelerin aynı olduğunu düşünerek bash yapmamın bir yolu var mı? Komutlarımda asla virgül kullanmam. İdeal olarak, ben takma istiyorum ,,için ... Bunu denediğimde işe yaramadı. Bu neden işe yaramadı? Bu soruna başka nasıl yaklaşabilirim?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
Diğer ad, programın argümanı değil, çalıştırılacak bir programdır; böylece $ ,,örneğin, şikayet ediyorum: bash: ..: Is a directory. (Başka bir deyişle, çalıştırılabilir değil.)
jpaugh 21

5
@jpaugh: Bunu söylemenin daha açık bir yolu: takma adın genişlemesi yalnızca komutun ilk "sözcüğü" nde gerçekleşir. Söylediğin gibi, sadece komut isimleri için çalışıyor, hata değil. (Ve sen bile yapamazdın alias 'cd ,,'='cd ..'. Şey, yapabilirsin, ama cd\ ,,hepsini tek bir kelime yapmak için kullanman gerekirdi .)
Peter Cordes

5
Zsh'i düşünün. O kadar, küresel adlar vardır alias -g ,,=..ve cd ,,bunu bekliyoruz gibi çalışır.
muru

1
Yanal düşünme: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
Imho: Bunu yapma. Tipografik hataları örtbas etmek için takma ad kullanmak kötü bir uygulamadır. Bu hatalar kopyalanan yapıştırma koduna veya ekran yazılarına neden olabilir. Diğer ana bilgisayarlarda veya hesaplarda çalışmaz. Ve bu tür bir değişiklik (nasıl uygulandığına bağlı olarak) diğer, beklenmeyen ve hata ayıklama hatalarına neden olabilir. Önerim: Bir komutu yanlış yazarsanız, tekrar yazın ;-)
jjmontes

Yanıtlar:


45

ZSH:

Kullanıyorsanız zsh alias -g ,,="..", ihtiyacınız olan şey budur, ancak bu yalnızca kullanıldığında değil her yerde ",," genişlemesine neden olur cd.

Kimden man zshbuiltins:

-g Bayrak varsa, global bir takma ad tanımlayın; global takma adlar, komut konumunda bulunmasalar bile genişletilir.

BASH:

Kısıtlanırsa bash(soru ile etiketlendiği için ), aşağıdakileri okuyun:

Bu, istenildiği gibi tamamen takma bir çözümdür, ancak bu kullanıcının muhtemelen sinir bozucu olması gerekenden fazlasını yapacaktır (yazımın sonundaki uyarıya bakın).

Alıntı yapmak man bash:

Diğer ad değerinin son karakteri boşsa, diğer adı izleyen bir sonraki komut sözcüğü ayrıca diğer ad genişletme olup olmadığını denetler.

Bu nedenle cd, fazladan boşluk içeren bir takma ad (bir sonraki argümanının genişletilmesine izin vermek için) ve sonra takma ad ,,için yeterlidir ... Şuna bak

alias cd='cd '
alias ,,='..'

tam olarak ihtiyacınız olanı verir.

Bunun yalnızca bash(ve aliasuygulamasının) değil, tüm POSIX-compilant mermilerinin de doğru olduğunu unutmayın . Bir örnekten alıntı yapmak man 1p alias(kılavuz bu özelliği açıkça, sadece bir örnek yoluyla tanımlamaz):

  1. Nohup'u kurun, böylece kendisi bir takma ad olan bir argümanla başa çıkabilir:

           alias nohup="nohup "

Uyarı: @PeterCordes yorumunda yazdığı gibi, diğer takma adların sonra yazıldığında otomatik olarak genişlemesine neden olur cd. cd \grepDizini bir adla değiştirmek isterseniz yazmanız gerekebilir, grepancak adınız grepbir takma addır grep --color=auto. Ters eğik çizgi olmadan, cd"çok fazla argüman" hatası rapor edilir (aynı anda cdiki dizine gidemezsiniz !).


22
Bu akıllı ama pis bir kesmek. Bunu yapmak istemem; yanlışlıkla seni ısırmak için çok kolay. Örneğin, yaygın olarak çalıştırdığınız bir komut için bir takma adınız varsa cdve kaynak kodunun bir dizinine girmek istiyorsanız . Veya takma adlarınızla ortak dizin adları arasındaki diğer çarpışmalar. Sanki bu takma adla benim için cd drgenişleyecekti cd disown -r. Neyse, böyle bir şey için yerleşik cdbir işlevi geçersiz kılmak için IMO.
Peter Cordes

8
Takma ad çözümü için +1 (bir şey öğrendim). Aynı zamanda Peter'ın yorumuna katılıyorum. Sanırım cevabınıza bir tür açık uyarı eklenmeli.
Kamil Maciorowski

58

Takma adların bunu yapması amaçlanmamıştır, ancak cdgerçek için sarıcı denilen bir işlev oluşturabilirsiniz cd. Bu benim için çalışıyor! Sadece kendi .bash_profileveya seçtiğiniz dosyaya yerleştirin.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Veya yorum ve güzel biçimlendirme ile:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

DÜZENLE

if then elseBurada daha iyi olduğunu belirttiğiniz için @derobert teşekkürler && ||. Ayrıca, bu uygulamanın sadece yol dışı argümanlar (yani ) ilk argüman olmadığında çalışacağını fark ettim ( * facepalm *) -L -P. Bu yüzden, kötü bir yazma alışkanlığınız varsa, bu size yardımcı olmayacak diye uyarılırsınız cd -L ,,. Ve bence bu doğru şekilde işlemenin önemsiz olduğunu düşünüyorum.


16
@ BenjiWiebe "Yorumlar ve güzel biçimlendirme" sürümü bir if-then-else ile daha iyi olacağını düşünüyorum.
zwol

Vay millet, birçok iyi fikir. Gördüğüm düzeltmeleri yapmak için düzenleme özelliğini kullandığını görüyorum. Test etmek için fazla zaman harcamadım. :)
BenjiWiebe

1
Alternatif olarak, $1yerleşik yapmadan önce sadece üzerine yazın:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}"veya ilk argümandan sonra herhangi bir şey kaybedersiniz.
chepner

8
Ayrıca, teknik ..olarak ilk argüman olmak zorunda değildir; cdiçinde bashçeşitli seçenekler alabilir ( -P, -L, -@, -e).
chepner

29

Diğer adlar bir komutun ilk sözcüğü olmalıdır . Ayrıca, diğer ad bir kelimenin yerine boşluk içermemelidir.

Bash Referans Kılavuzu: Takma Adlar

Diğer adlar, basit bir komutun ilk sözcüğü olarak kullanıldığında, bir dizgenin bir sözcükle değiştirilmesine izin verir .

Hem diğer ad olabilir ..ve ,,olmak cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

Ben de aynısını yapıyorum! : D bu iki nokta / virgül yazmak çok daha kolaydırcd ..
rav_kr

10
+1, bu hiç de fena bir fikir değil. .. Bash'de yapmanın bir başka yolu da shopt -s autocd, sadece adını girerek herhangi bir dizine geçmenizi sağlayan yöntemdir . Tabii ki hala alias için,,
ilkkachu


3

Yapmak için başka bir yol ..dizini değiştirmek Bash'in sağlamaktır autocd özelliği :

shopt -s autocd 

Birinin adını girdiğinizde bu otomatik olarak dizini değiştirir:

~$ /tmp
cd /tmp
/tmp$ 

Hala bir takma ad yapmak zorundasınız ,,ama bu sadece ile yapılabiliralias ,,=..


2

Zaten bunun için bir komut dosyası var: https://github.com/shyiko/commacd (Stanley Shuyiko ile ilişkisi yoktur).

commacdüç komutu dışa aktarır: ,(ileriye atlamak için), ,,(geri) ve ,,,(geri + ileri):

Üçü de ilk önce önek ile eşleşmeye çalışır. Yalnızca sonuç bulunamazsa, alt dize (bulanık) eşleşmesine geri dönerler

Sorunuzu yanıtlamak için komut dosyası diğer adı, tanımladığı üç işlevle virgül oluşturur:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
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.