Bagaimana cara menambahkan fungsi ke .bash_profile / .profile / bashrc di shell?

24

Saya memiliki fungsi yang mengubah zaman ke tanggal. Inilah definisi

date1(){
  date -d @$1
}

Saya ingin dapat menulis:

$ date1 xxxyyy

Di mana xxxyyy adalah parameter yang saya masukkan ke fungsi saya sehingga saya bisa mendapatkan tanggal yang sesuai. Saya mengerti bahwa saya harus menambahkannya baik .bash_profile, .profileatau .bashrckemudian sumber itu:

$ source file

Tapi, saya tidak yakin file yang akan dimasukkan. Saat ini, saya memilikinya .profile. Tetapi untuk menjalankannya, saya harus melakukannya source .profilesetiap waktu.

Idealnya, itu harus membuatnya tersedia, ketika komputer dinyalakan seperti variabel lingkungan.

Kawan
sumber
untuk sampel input; 1.text output epochconverter.com sekarang adalah 1514917788; 2.dari bash sendiri $ date +% s per stackoverflow.com/questions/1092631/...
AnneTheAgile

Jawaban:

25

Dari man bash:

Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan mengeksekusi perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca.

Dengan kata lain, Anda dapat meletakkannya di salah satu dari ~/.bash_profile, ~/.bash_loginatau ~/.profile, atau file apa saja sourceoleh salah satu dari mereka . Biasanya ~/.profileakan sumber ~/.bashrc, yang merupakan "file inisialisasi pribadi, dieksekusi untuk shell login."

Untuk mengaktifkannya, jalankan shell baru, jalankan exec $SHELLatau jalankan source ~/.bashrc.

l0b0
sumber
1
Yah saya mencoba cara Anda untuk membuat fungsi kustom mencetak argumen itu, tetapi bahkan jika saya menambahkan fungsi itu .bash_profilemaka saya harus melakukan source ~/.bash_profilesetiap kali saya membuka terminal dengan cara pintas Ctrl+Alt+T.
Vicky Dev
@VickyDev Jika Anda harus source ~/.bash_profilesetiap waktu maka itu indikasi bahwa pengaturan Bash Anda entah bagaimana tidak standar atau rusak (sesuai dengan man bashoutput yang disebutkan). Apakah Anda yakin Anda benar-benar menjalankan Bash? Misalnya, apakah echo $BASHPIDmencetak sesuatu?
l0b0
Apakah Anda perlu menambahkan #!/bin/shke atas .profileuntuk mendefinisikan suatu fungsi?
Ngarai Kolob
13

Setelah Anda menentukan fungsi di Anda .profile, tambahkan export -f date1. Ini akan mengekspor fungsi untuk digunakan oleh shell login Anda.

DopeGhoti
sumber
+1 untuk ekspor, saya harus memohon dan alias di ssh ProxyCommand, dan terus mengutip tentang alias tidak ditemukan bahkan setelah sumber .profile. Bekerja seperti pesona setelah ekspor.
Abhishek Anand
7

Penyesuaian untuk shell interaktif masuk ke ~/.bashrc. Hal-hal yang ingin Anda jalankan ketika Anda masuk ~/.profile(atau ~/.bash_profile, tetapi seringkali tidak dimuat saat masuk secara grafis).

Masukkan definisi fungsi ini ke dalam ~/.bashrc.

Karena bash tidak dimuat .bashrcsaat itu adalah shell login, paksakan untuk melakukannya: tulis ~/.bash_profilemengandung

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

yaitu memuat ~/.profile, dan juga memuat ~/.bashrcjika shell bersifat interaktif.

Lihat Alternatif untuk .bashrc dan tulisan yang tertaut di sana.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

csh dan tcsh tidak mendukung fungsi seperti bash tetapi Anda dapat melakukannya.

Sebagai contoh, inilah fungsi sederhana untuk mencetak beberapa teks

alias print_hello_world 'eval echo "hello world"'

meneruskan argumen ke skrip

repeate_after_me 'eval echo "$1"'

melakukan multi-line code seperti pernyataan if agak rumit tapi begini saja.

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

Anda masih harus eval tetapi bagian yang paling kompleks adalah melakukan \!:[x]sintaks untuk mendapatkan input dari baris perintah.

Itu seharusnya cukup untuk membuat Anda beres.

pengguna1610950
sumber
0

Anda dapat mengalihkan semua fungsi saat ini ke bashrc dengan mengeset .

Sebagai contoh, inilah cara saya menambahkan fungsi perintah openstack dengan parameter opsional, ke dalam bashrc:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Sekarang disimpan untuk sesi mendatang, dan dapat digunakan seperti:

$ urc 

atau

$ urc --debug
Noam Manos
sumber
-1

Poin 18: Dalam ingatanku yang lebih lama ketika seorang admin, belajar ksh dan bash adalah kina sebaliknya. 1: - / etc / konten profil adalah sysWide. / etc / skel berisi file yang diberikan ke akun baru. Karena Bash sekarang menjadi yang paling umum dari semua distro. yang berikutnya adalah 2: - ~ /. profil sebagai standar sistem kemudian dalam isi. profil "jika ada" .bash_profile akan meletakkan -> 3: - .bash_profile 4: - .bash_login 5: - .bashrc .bash_aliases akan berada di pikiran saya urutan yang lebih benar, mengatur lingkungan Terminal dan Shell standar dan .bash_login biasa tidak pernah ditemukan atau ada (kustom per pengguna). Dengan .profile $ PATH menjadi utama jika.
Saya menemukan sekarang juga menambahkan .bash_profile .profile masih mendominasi dan tidak menghormati keberadaan .bash_profile. Seiring dengan info tajuk, tidak ada yang memperbarui yaitu: bash startup Sampel - bahwa struktur direktori tidak lagi - bersama dengan contoh dan atau file gzip. Jadi pembaruan ke Gnu-Bash sudah beres

AtomicK
sumber
1
Apa yang sedang terjadi
Jesse_b