Apakah mungkin untuk mendefinisikan perintah dalam bash?

25

Misalnya, dapatkah saya mengatur:

gb = cd /media/Dan/evolution

... sehingga setiap kali saya mengeksekusi gbdi bash, saya bisa cdke direktori tertentu?

Saya menemukan sesuatu yang online: aliasperintah. Tetapi tampaknya itu tidak dapat melakukan pekerjaan di atas.

Apakah mungkin untuk melakukannya? Bagaimana?

Zen
sumber
10
alias gb='cd /media/Dan/evolution'
Nykakin
4
@ Zen, silakan terima jawabannya jika itu menyelesaikan masalah. Ini adalah isyarat untuk mengucapkan terima kasih kepada pengguna yang membantu Anda dalam menyelesaikan masalah :)
Ramesh
2
Catatan: Ini tentang bash: Linux adalah kernel. Linux sering, secara keliru, digunakan untuk merujuk ke keseluruhan sistem operasi. Ini dapat menyebabkan kebingungan. Misalnya pertanyaan "bisakah saya melakukan ini dan itu di Linux?" Adalah jika Anda dapat melakukannya di beberapa komputer, maka ya. Karena Anda bisa menerapkan sistem operasi apa pun yang Anda suka menggunakan kernel Linux. Jadi kita perlu tahu yang mana, Anda menggunakan Ubuntu Gnu + Linux + mungkin X11 (jika pada desktop misalnya bukan server tanpa tampilan).
ctrl-alt-delor
@ Richard Poin bagus, meskipun secara teknis ini posixkeluhan, jadi tidak adil bash.
1
@ Richard Memang, itulah masalahnya. Ini bekerja karena orang tidak bermaksud Android dan rasa seperti itu, lebih atau kurang. Saya tidak mengatakan itu hal yang baik, tetapi memang demikian adanya. Referensi saya implisit karena saya mengomentari pernyataan linux Anda. Saya baru saja menjelaskan karena subjeknya adalah istilah yang membingungkan. (Saya mungkin salah paham dengan komentar terakhir Anda)
keyser

Jawaban:

50

ketik saja:

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

Untuk membuat pengaturan ini permanen (sehingga tetap setelah Anda me-restart atau membuka konsol lain) tambahkan baris ini ke file ~ / .bashrc (dengan asumsi Anda menggunakan bash sebagai shell default)

schrobe
sumber
Untuk membuatnya lebih menyenangkan, Anda dapat membuat file alias khusus untuk orang asing Anda, katakan ~ / .bash_aliases, dan panggil dari dalam file ~ / .bashrc Anda seperti ini: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases Dengan cara ini, Anda tidak "mencemari" file ~ / .bashrc dengan hal-hal lain.
GeertVc
39

Alternatif untuk aliasing

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

Ini mendefinisikan shell function gb, yang tidak membutuhkan argumen, dan menjalankan cd / media / Dan / evolution. Seperti saran lainnya, ini dapat ditambahkan ke ~ / .bashrc

pengguna1207217
sumber
Dengan kurang beruntung bahwa perintah alias menunjukkan alias yang ditentukan, afaik mendefinisikan fungsi seperti itu dapat mengakibatkan "perilaku tak terduga". Saya akan memilih Anda demi kelengkapan :)
vfbsilva
7
Tidak juga. Anda cukup mengetik: menyatakan -f gb untuk melihat fungsinya
Paul Calabro
11
Selain itu, opsi ini lebih fleksibel karena memungkinkan Anda untuk menambahkan logika khusus dalam definisi fungsi untuk menerima argumen dan melakukan apa pun yang Anda butuhkan. Alias ​​hanya memungkinkan lewat argumen dan melakukan tindakan yang telah ditentukan .
Paul Calabro
5
@ PaulCalabro Bahkan lebih baik, type gbakan berfungsi jika itu alias atau fungsi.
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- \nkarakter adalah baris baru literal dalam output.
mikeserv
11

Itu mungkin, dan aliasmerupakan perintah yang Anda cari. Misalnya alias ll="ls -l"di bash akan membiarkan Anda mengetik llbukan ls -l. Harap perhatikan tidak ada spasi yang digunakan saat mengatur alias. man aliasdapat bermanfaat juga.

schaiba
sumber
-3

Atau, dimungkinkan untuk menulis program C yang memanggil perintah yang diinginkan dan menyimpannya ke / usr / bin.

#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;
}

Untuk mengkompilasinya, buka direktori tempat sumber disimpan (dalam bash) dan jalankan (Anda mungkin perlu sudo):

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

Setelah penelitian lebih lanjut di sini , saya menyadari hanya melemparkan perintah Anda system()tidak akan bekerja untuk perintah bash built in. Itu sebabnya Anda perlu membuat instance dari bash interaktif dan gema perintah Anda untuk itu. Itu terlalu rumit dan mungkin tidak berguna, kecuali jika Anda ingin, katakanlah, persingkat panggilan ke skrip shell ( some_scriptbukan sh ~/radgeRayden/Scripts/some_script).

Referensi untuk fungsi system ()

radgeRayden
sumber
2
Apakah Anda benar-benar mencoba ini? Itu tidak bekerja.
Dennis
1
Untuk alasan yang sama itu sh -c "cd /media/Dan/evolution"tidak berhasil. Petunjuk: subshell
Digital Trauma
5
cd/ subshell masalah samping, apa keuntungan dalam membungkus perintah shell dalam program c, ketika Anda bisa dengan mudah (atau lebih mudah) memasukkan perintah itu dalam skrip shell?
Digital Trauma
1
Bukan ahli dalam hal ini, tetapi bukankah seharusnya hal seperti ini (semoga, sesuatu yang lebih bermanfaat) dimasukkan ke / usr / local / bin?
Joe
2
Bahkan jika ini BISA bekerja, itu tidak boleh masuk ke / usr / local / bin karena khusus untuk satu pengguna.
Johan