Bash'ta bir komut tanımlamak mümkün mü?


25

Örneğin, ayarlayabilir miyim:

gb = cd /media/Dan/evolution

... böylece bash'te her çalıştırdığımda o dizine gbgidebilirmiyim cd?

Çevrimiçi bir şey buldum: aliaskomut. Ancak yukarıdaki işi yapamadığı anlaşılıyor.

Bunu yapmak mümkün mü? Nasıl?


10
alias gb='cd /media/Dan/evolution'
Nykakin

4
@Zen, sorunu çözerse cevabı lütfen kabul edin. Bu, sorunu
Ramesh

2
Not: Bu bash ile ilgili: Linux bir çekirdek. Linux, çoğu zaman, yanlış olarak, tüm işletim sistemine gönderme yapmak için kullanılır. Bu karışıklığa neden olabilir. Mesela “Linux altında böyle bir şey yapabilir miyim?” Sorusu, eğer bir bilgisayarda bunu yapabilirseniz evet demektir. Çünkü Linux çekirdeği kullanarak istediğiniz herhangi bir işletim sistemini uygulayabilirsiniz. Bu yüzden hangisini bilmemiz gerekiyor, Ubuntu Gnu + Linux + muhtemelen X11 kullanıyorsunuz (masaüstünde, yani ekransız bir sunucuda değilse).
ctrl-alt-delor

@ richard İyi nokta, teknik olarak bu posixşikayet olsa da , sadece değil bash.

1
@ richard Aslında, sorun bu. İnsanların Android'i ve bu lezzetleri, az ya da çok kastetmediği için işe yarıyor. Bunun iyi bir şey olduğunu söylemiyorum ama olan bu. Tavsiyem, linux beyannamesine yorum yaptığımdan beri örtüktü. Konu kafam karıştığından beri kendimi netleştiriyordum. (Son yorumunuzu yanlış anlamış olabilirim)
keyser,

Yanıtlar:


50

sadece yaz:

alias gb='cd /media/Dan/evolution'

Bu ayarı kalıcı hale getirmek için (başka bir konsolu yeniden başlattıktan veya açtıktan sonra yapışacak şekilde) bu satırı ~ / .bashrc dosyasına ekleyin (bash'i varsayılan kabuğunuz olarak kullandığınızı varsayarak)


Daha da güzelleştirmek için, takma adlarınız için ayrılmış bir takma ad dosyası oluşturabilir, ~ / .bash_aliases diyebilir ve ~ / .bashrc dosyanızın içinden şöyle diyebilirsiniz: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases Bu şekilde, ~ / .bashrc dosyasını diğer şeylerle "kirletmeyin".
GeertVc

39

Aliasing'e alternatif

gb() { cd /media/Dan/evolution; }

Bu, argüman almayan kabuk fonksiyonunu gb'yi tanımlar ve cd / media / Dan / evrim gerçekleştirir. Diğer önerilerde olduğu gibi, bu ~ /.


Alias ​​komutunun tanımlanmış diğer adı göstermesi dezavantaj ile, böyle bir işlevi tanımlayan afaik "beklenmeyen davranış" ile sonuçlanabilir. Tamamlanma uğruna sizlere oy vereceğim :)
vfbsilva

7
Pek sayılmaz. Sadece şunu yazabilirsiniz: -f gb'nin ne yaptığını görmek için
Paul Calabro

11
Ayrıca, bu seçenek argümanları kabul etmek ve ihtiyacınız olanı yapmak için işlev tanımına özel mantığınızı eklemenize izin vermesi bakımından daha esnektir . Takma adlar yalnızca değişkenlerin geçilmesine ve önceden tanımlanmış eylemlerin yapılmasına izin verir .
Paul Calabro

5
@ PaulCalabro Daha da iyisi, type gbbir takma ad veya işlev ise çalışacaktır.
Sparhawk

POSIXLY: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- \nKarakterler çıktıdaki değişmez satırlardı.
mikeserv

11

Bu mümkün ve aliasaradığınız komut. Örneğin alias ll="ls -l", bash llyerine yazmanıza izin verir ls -l. Diğer adı ayarlarken hiçbir boşluk kullanılmadığını lütfen unutmayın. man aliasde yararlı olabilir.


-3

Alternatif olarak, istenen komutu çağıran bir C programı yazmak ve / usr / bin dosyasına kaydetmek mümkündür.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Derlemek için kaynağın kaydedildiği dizine (bash olarak) gidin ve çalıştırın (sudo'ya ihtiyacınız olabilir):

 gcc ./gb.c -o /usr/bin/gb

Burada daha fazla araştırma yaptıktan sonra , yalnızca emrinizi atmanın system()bash emirlerde işe yaramayacağını anladım . Bu yüzden etkileşimli bir bash örneği oluşturmanız ve komutlarınızı ona yansıtmanız gerekir. Bu sadece aşırı karmaşık ve muhtemelen işe yaramaz, istemediğiniz sürece, bir kabuk betiğini ( some_scriptkısaca sh ~/radgeRayden/Scripts/some_script) kısaltmak istemeyiz .

System () işlevi için referans


2
Bunu gerçekten denedin mi? Çalışmıyor.
Dennis,

1
Aynı sebepten dolayı sh -c "cd /media/Dan/evolution"işe yaramadı. İpucu: subshell
Digital Trauma

5
cd/ subshell sorunları bir yana, c komutunda bir kabuk komutunu sarmalamanın avantajı nedir, bu komutu bir kabuk komut dosyasına ne kadar kolay (ya da daha kolay) koyarsanız?
Dijital Travma,

1
Bu konuda uzman değiliz, ancak böyle bir şey (umarım daha yararlı bir şey) / usr / local / bin dizinine yerleştirilmemeli midir?
Joe,

2
Bu COULD çalışsa bile, bir kullanıcıya özgü olduğu için / usr / local / bin dizinine girmemelidir.
Johan,
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.