Di mana saya bisa meletakkan fungsi shell yang ditentukan pengguna?

14

Saya berencana untuk membuat fungsi yang akan menyederhanakan hal bagi saya. Fungsinya akan seperti

function lazymode()
{
echo "Hello World!";
}

sehingga ketika saya menggunakan perintah lazymodedi shell , itu akan menampilkan Hello World!.

File apa yang harus saya masukkan fungsi yang ditentukan pengguna?

Abel Melquiades Callejo
sumber

Jawaban:

14

Tergantung pada fungsinya. Jika itu hanya satu-liner super-sederhana seperti itu Anda bisa membuat alias atau menempelkan fungsi dalam ~/.bashrc(file yang memuat bash saat dimulai).

Jika Anda membuat sesuatu yang sedikit lebih gemuk, mungkin lebih masuk akal untuk membuat skrip yang dapat dieksekusi sendiri di ~/bin/mana tidak akan ada secara default (itu hanya sebuah direktori) tetapi harus berada di jalur Anda. Ingat untuk ini file harus dapat dieksekusi ( chmod +x filename) dan mulai dengan #!/bin/bashbait yang tepat .

Rute kedua memiliki beberapa manfaat jelas:

  • Lebih mudah untuk melihat apa yang tersedia
  • Kesalahan sintaksis tidak akan memangkas profil Anda
  • Anda tidak perlu terus membuat ulang bash config Anda jika Anda mengubah skrip
  • Ini tersedia untuk semua shell selama path lengkap digunakan atau ~/bin/dalam path untuk shell itu juga (yang seharusnya dalam kebanyakan kasus AFAIK).
Oli
sumber
Saya menggunakan opsi nanti. Fungsi saya berisi perintah yang menghapus file, sesuatu wget, mengeksekusi perintah javac dan java. dan ketika saya mencobanya di terminal gnome, itu tidak berfungsi dengan baik. Apakah Anda pikir ada masalah?
Abel Melquiades Callejo
Apa yang dilakukannya?
Oli
Sudah diperbaiki. Diperbaiki melalui jawaban ini
Abel Melquiades Callejo
umm ... bukankah skrip pengguna harus di /usr/local/binganggu dengan $PATH?
Braiam
Sepertinya saya bahwa keuntungan kecil tapi layak disebutkan menempatkan fungsi di ~/.bashrc(karena sourced) adalah bahwa Bash mencari fungsi sebelum melakukan pencarian PATH.
Zanna
4

Pilihan terbaik adalah ~/.bashrcfile.

Anda dapat menulis definisi fungsi shell Anda langsung di ~/.bashrcfile Anda , atau, jika Anda memiliki banyak dari mereka dan tidak ingin mengacaukan ~/.bashrcfile Anda, Anda dapat meletakkan semuanya di file lain yang Anda pilih - pastikan untuk sumber itu file dalam file Anda ~/.bashrc. Misalnya, jika file dengan fungsi Anda dinamai bash_functions, cukup tambahkan ~/.bashrcfile Anda baris:

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

atau, yang setara:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

di mana .hanya merupakan representasi simbolis dari source. The ifuji merek yakin file /path/to/bash_functionsada sebelum mencoba untuk sumber itu.

Teknik ini sangat mirip dengan membangun alias ~/.bashrcdengan membuat file yang dipanggil ~/.bash_aliasesdan menggunakan sintaksis yang sama dengan yang di atas ~/.bashrcuntuk menguji keberadaannya dan kemudian sumber itu.

Radu Rădeanu
sumber
terima kasih, itu berhasil. Ngomong-ngomong, apa bedanya dengan .profile? di beberapa linux, saya tidak bisa meletakkan fungsi di bashrc
Abel Melquiades Callejo
2
~/.profilefile dieksekusi oleh interpreter perintah untuk shell login. Ketika Anda menggunakan GUI dan Anda membuka terminal, file itu tidak dieksekusi karena Anda akan berada di shell tidak masuk.
Radu Rădeanu
1

Berikut adalah prosedur penting untuk mendeklarasikan fungsi permanen:

  1. Buka ~/.bashrcfile dalam editor teks. Tidak masalah editor teks mana, asalkan Anda tahu cara menggunakannya dan selama Anda membuka/home/<username>/.bashrc

  2. Di akhir ~/.bashrcmenyatakan fungsi Anda sendiri, misalnya:

    find_dirs(){
        find "$1" -type d
    }
  3. Simpan dan tutup file.

The ~/.bashrcfile dibaca setiap kali Anda membuka shell interaktif (yang tab baru terminal, login melalui ssh, atau tty1 terbuka atau konsol virtual lainnya). Ini tidak akan tersedia dalam file skrip, karena ~/.bashrctidak dibaca untuk shell non-interaktif. Ini juga tidak tersedia jika Anda menjalankan bashdengan --norcopsi.

Jika Anda ingin fungsi tersedia segera di tab yang sedang terbuka, gunakan source ~/.bashrcperintah.


Fungsi mengambil argumen seperti perintah biasa. Misalnya, $1dengan $9menunjukkan parameter posisi saat Anda memanggil suatu fungsi. Dalam contoh di atas hanya find_dirsmengambil satu parameter posisi, dan akan disebut sebagai find_dirs /etc. Anda juga dapat menggunakan $@untuk merujuk ke semua parameter posisi. Fungsinya juga menerima pengalihan. Anda dapat memanggil suatu fungsi dengan find_dirs $1 > /dev/null; kami juga dapat mendeklarasikannya sebagai berikut:

find_dirs(){
    find "$1" -type d
}

Catatan dari man bash: "Fungsi dijalankan dalam konteks shell saat ini; tidak ada proses baru yang dibuat untuk menafsirkannya". Itu berarti Anda juga harus mengetahui fungsi yang memiliki kemampuan untuk mengubah lingkungan eksekusi shell Anda - ubah variabel dan pengaturan terminal.

Sergiy Kolodyazhnyy
sumber