Saya menggunakan hampir 10 tahun penggunaan Linux untuk mengajukan pertanyaan ini. Itu semua trial and error dan surfing internet larut malam secara acak.
Tetapi orang tidak perlu membutuhkan 10 tahun untuk ini. Jika saya baru memulai dengan Linux, saya ingin tahu: Kapan harus alias, kapan harus skrip, dan kapan harus menulis fungsi?
Dalam hal alias, saya menggunakan alias untuk operasi yang sangat sederhana yang tidak mengambil argumen.
alias houston='cd /home/username/.scripts/'
Itu tampak jelas. Tetapi beberapa orang melakukan ini:
alias command="bash bashscriptname"
(dan tambahkan ke .bashrc
file)
Apakah ada alasan bagus untuk melakukan itu? Saya berusaha sangat keras, tetapi saya benar-benar tidak dapat memikirkan keadaan di mana saya ingin melakukan itu. Jadi, jika ada kasus tepi di mana itu akan membuat perbedaan, harap jawab di bawah ini.
Karena di situlah saya hanya akan meletakkan sesuatu di PATH saya dan chmod +x
itu, yang merupakan hal lain yang muncul setelah bertahun-tahun Linux coba-coba.
Yang membawa saya ke topik selanjutnya. Sebagai contoh, saya menambahkan folder tersembunyi ( .scripts/
) di direktori home ke PATH saya dengan hanya menambahkan baris ke .bashrc
( PATH=$PATH:/home/username/.scripts/
) saya , jadi apa pun yang dapat dieksekusi di sana autocomplet secara otomatis.
Jika saya perlu.
Aku tidak benar-benar membutuhkan itu, kan? Saya hanya akan menggunakannya untuk bahasa yang bukan shell, seperti Python.
Jika itu shell, saya bisa menulis fungsi di dalamnya .bashrc
:
funcname () {
somecommand -someARGS "$@"
}
Seperti yang saya nyatakan, saya menemukan banyak hal ini melalui trial and error. Dan saya hanya benar-benar melihat keindahan fungsi ketika komputer saya mati dan saya dipaksa untuk menggunakan komputer orang-orang di sekitar saya ketika mereka tidak menggunakannya.
Alih-alih memindahkan seluruh direktori skrip dari komputer ke komputer, saya akhirnya hanya mengganti .bashrc milik orang lain dengan milik saya, karena mereka bahkan tidak pernah membuat satu modifikasi pun.
Tetapi apakah saya melewatkan sesuatu?
Jadi, apa yang akan Anda beri tahu pengguna Linux pemula kapan harus alias, kapan harus skrip, dan kapan harus menulis fungsi?
Jika tidak jelas, saya berasumsi orang-orang yang menjawab ini akan menggunakan ketiga opsi tersebut. Jika Anda hanya menggunakan alias, atau hanya menggunakan skrip, atau hanya menggunakan fungsi — atau jika Anda hanya menggunakan alias dan skrip atau alias dan fungsi atau skrip dan fungsi — pertanyaan ini tidak benar-benar ditujukan kepada Anda.
sumber
Jawaban:
Alias seharusnya secara efektif tidak (secara umum) melakukan lebih dari mengubah opsi default suatu perintah. Itu tidak lebih dari penggantian teks sederhana pada nama perintah. Itu tidak bisa melakukan apa pun dengan argumen tetapi meneruskannya ke perintah yang benar-benar berjalan. Jadi jika Anda hanya perlu menambahkan argumen di depan satu perintah, alias akan berfungsi. Contoh umum adalah
Suatu fungsi harus digunakan ketika Anda perlu melakukan sesuatu yang lebih kompleks daripada alias tetapi itu tidak akan berguna sendiri. Misalnya, ambil jawaban ini pada pertanyaan yang saya ajukan tentang perubahan
grep
perilaku default tergantung pada apakah itu ada dalam jalur pipa:Ini adalah contoh sempurna dari suatu fungsi karena terlalu kompleks untuk sebuah alias (memerlukan standar berbeda berdasarkan kondisi), tetapi itu bukan sesuatu yang Anda perlukan dalam skrip non-interaktif.
Jika Anda mendapatkan terlalu banyak fungsi atau fungsi terlalu besar, masukkan ke dalam file terpisah di direktori tersembunyi, dan sumberkan di
~/.bashrc
:Sebuah skrip harus berdiri sendiri. Itu harus memiliki nilai sebagai sesuatu yang dapat digunakan kembali, atau digunakan untuk lebih dari satu tujuan.
sumber
.
atausource
- skrip dijalankan dengan proses bash terpisah dan memiliki lingkungannya sendiri. Karena alasan ini, segala sesuatu yang memodifikasi lingkungan shell (mis. Fungsi, variabel, dll.) Tidak akan bertahan dalam lingkungan shell dari mana Anda menjalankan skrip.Jawaban lain memberikan beberapa pedoman umum lunak berdasarkan selera pribadi, tetapi mengabaikan banyak fakta terkait yang harus dipertimbangkan ketika memutuskan antara skrip, fungsi, atau alias.
Alias dan Fungsi ¹
Skrip
$PATH
pencarian, banyak shell menyimpan hash dari nama jalurnya dalam memori untuk menghemat waktu pada$PATH
pencarian selanjutnya, tetapi itu adalah sejauh mana jejak memori skrip saat tidak digunakan.Script dapat dipanggil dengan lebih banyak cara daripada fungsi dan alias. Mereka dapat diteruskan sebagai argumen kepada penerjemah, seperti
sh script
, atau dipanggil langsung sebagai yang dapat dieksekusi, dalam hal ini penerjemah di baris shebang (mis.#!/bin/sh
) Dipanggil untuk menjalankannya. Dalam kedua kasus tersebut, skrip dijalankan oleh proses juru bahasa yang terpisah dengan lingkungannya sendiri yang terpisah dari shell Anda, yang lingkungannya tidak dapat mempengaruhi skrip dengan cara apa pun. Memang, shell juru bahasa bahkan tidak harus cocok dengan shell yang memanggil. Karena skrip yang dipanggil dengan cara ini tampaknya berperilaku seperti yang dapat dieksekusi biasa, skrip dapat digunakan oleh program apa pun.Akhirnya, skrip dapat dibaca dan dijalankan oleh shell saat ini dengan
.
, atau dalam beberapa shellsource
,. Dalam hal ini, skrip berperilaku seperti fungsi yang dibaca on-demand alih-alih disimpan di memori.Aplikasi
Mengingat hal di atas, kita dapat menemukan beberapa pedoman umum untuk apakah membuat sesuatu menjadi skrip atau fungsi / alias.
Apakah program lain selain shell Anda harus dapat menggunakannya? Jika demikian, itu harus berupa skrip.
Apakah Anda hanya ingin itu tersedia dari shell interaktif? Adalah umum untuk ingin mengubah perilaku default banyak perintah ketika dijalankan secara interaktif tanpa mempengaruhi perintah / skrip eksternal. Untuk kasus ini, gunakan alias / fungsi yang diatur dalam file rc "interactive-mode-only" shell (untuk
bash
ini.bashrc
).Apakah perlu mengubah lingkungan shell? Baik fungsi / alias atau skrip bersumber adalah pilihan yang memungkinkan.
Apakah ini sesuatu yang sering Anda gunakan? Mungkin lebih efisien untuk menyimpannya di memori, jadi buatlah fungsi / alias jika memungkinkan.
Sebaliknya, apakah itu sesuatu yang jarang Anda gunakan? Dalam hal ini, tidak ada gunanya menyimpannya ketika Anda tidak membutuhkannya, jadi buatlah skrip.
¹ Sementara fungsi dan alias memiliki beberapa perbedaan penting, mereka dikelompokkan bersama karena fungsi dapat melakukan semua alias. Alias tidak dapat memiliki variabel lokal dan tidak dapat memproses argumen, dan tidak nyaman untuk apa pun yang lebih dari satu baris.
² Setiap proses yang berjalan dalam sistem Unix memiliki lingkungan yang terdiri dari sekelompok
variable=value
pasangan yang sering berisi pengaturan konfigurasi global, sepertiLANG
untuk lokal default danPATH
untuk menentukan jalur pencarian yang dapat dieksekusi.sumber
alias g='gradle'
saya mendapatkan pelengkapan otomatis bertahap saat menggunakang
alias saya , tetapi tidak akan mengeluarkannya saat menggunakan skrip dengangradle $*
atau fungsi dengangradle $@
Saya pikir itu terserah selera masing-masing orang. Bagi saya logikanya seperti ini:
Sebenarnya tidak ada yang membatasi Anda untuk melakukan sesuatu yang berhasil .
sumber
Setidaknya sebagian karena masalah selera pribadi. Di sisi lain ada beberapa perbedaan fungsional yang jelas:
Melihat skrip shell yang telah saya lakukan beberapa tahun terakhir ini saya telah sedikit banyak berhenti menulis alias (karena mereka semua cenderung tumbuh menjadi fungsi dari waktu ke waktu) dan melakukan skrip hanya jika mereka perlu tersedia juga dari lingkungan non-bash.
PS:
alias command="bash bashscriptname"
Kalau saya tidak melihat alasan untuk melakukan ini. Bahkan jikabashscriptname
tidak dalam $ PATH, sederhanaalias c=/path/to/script
akan cukup.sumber
alias command="bash bashscriptname"
skrip tidak harus harus dieksekusi; dialias c=/path/to/script
itu harus.exec()
fungsi" :-)Berikut beberapa poin tambahan tentang alias dan fungsi:
Sebagai contoh:
Seperti yang bisa kita lihat, ada ruang nama terpisah untuk alias dan fungsi; lebih banyak detail dapat ditemukan menggunakan
declare -A -p BASH_ALIASES
dandeclare -f f
, yang mencetak definisi mereka (keduanya disimpan dalam memori).Contoh yang menunjukkan batasan alias:
Seperti yang bisa kita lihat alias tidak bersarang, tidak seperti fungsi. Selain itu, penggunaannya terbatas pada sesi interaktif.
Terakhir, perhatikan bahwa Anda dapat memiliki perhitungan sewenang-wenang dalam alias dengan mendeklarasikan fungsi yang segera memanggilnya, seperti:
yang sudah digunakan secara luas dalam kasus alias Git. Manfaat melakukannya daripada mendeklarasikan suatu fungsi adalah bahwa alias Anda tidak dapat ditimpa dengan sumber (atau menggunakan
.
) skrip yang kebetulan menyatakan fungsi dengan nama yang sama.sumber
Kapan menulis skrip ...
export
variabel dan / atau fungsi ed apa pun diteruskan oleh nilai ke skrip. Perubahan pada variabel-variabel tersebut tidak disebarkan kembali ke skrip induk.Kapan harus menulis fungsi ...
Kapan menulis alias ...
~/.profile
atau~/.bashrc
.Dalam skrip seperti skrip pustaka, kadang-kadang alias untuk fungsi diperlukan, seperti saat fungsi diganti tetapi kompatibilitas mundur diperlukan. Ini dapat dicapai dengan membuat fungsi sederhana dengan nama lama yang meneruskan semua argumennya ke fungsi baru ...
sumber
Satu hal lain yang saya tidak percaya telah dikemukakan: sebuah fungsi dijalankan dalam konteks proses pemanggilan, sedangkan sebuah skrip mengambil shell baru.
Ini bisa penting untuk kinerja - suatu fungsi lebih cepat, karena tidak
fork()
danexec()
. Dalam keadaan normal, perbedaannya sepele, tetapi jika Anda men-debug sistem yang kehabisan memori dan menghancurkan halaman, itu bisa membuat perbedaan besar.Juga, jika Anda ingin memodifikasi lingkungan shell Anda saat ini, Anda harus menggunakan suatu fungsi. Sebagai contoh, suatu fungsi dapat mengubah pencarian perintah
$PATH
untuk shell saat ini, tetapi skrip tidak bisa, karena itu beroperasi pada salinan fork / exec$PATH
.sumber
export -f
suatu fungsi, meskipun cara kerja yang tepat dari ini agak tidak jelas. Ini tidak portabel untuk shell Bourne tradisional saya percaya.Script dan alias dan skrip dan fungsi tidak saling eksklusif. Anda dapat dan menyimpan alias dan fungsi dalam skrip.
Script hanyalah kode yang dibuat gigih . Fungsi dan alias yang berguna yang ingin Anda gunakan di masa depan disimpan dalam skrip. Namun, skrip seringkali merupakan kumpulan lebih dari satu fungsi.
Karena alias tidak parameter , mereka sangat terbatas; biasanya untuk mendefinisikan beberapa parameter default.
Sebuah fungsi adalah unit yang terpisah dari kode , sebuah konsep yang didefinisikan dengan baik dari beberapa baris kode yang tidak dapat dipisahkan menjadi lebih kecil, bagian yang berguna; satu yang dapat digunakan kembali secara langsung atau lainnya oleh fungsi lain.
sumber
Jika harus sangat cepat, buatlah sebagai alias atau fungsi.
Jika harus dapat digunakan di luar shell pilihan Anda, buat skrip. 1
Jika perlu argumen, buatlah fungsi atau skrip.
Jika perlu mengandung karakter khusus, buatlah sebagai alias atau skrip. 2
Jika perlu bekerja dengan sudo, buat itu sebagai alias atau skrip. 3
Jika Anda ingin mengubahnya dengan mudah tanpa keluar dan masuk, skrip lebih mudah. 4
Catatan kaki
1 Atau jadikan sebagai alias, masukkan
~/.env
dan aturexport ENV="$HOME/.env"
, tetapi rumit untuk membuatnya bekerja dengan baik.2 Nama fungsi harus merupakan pengidentifikasi, sehingga harus diawali dengan huruf, dan hanya boleh berisi huruf, angka, dan garis bawah. Misalnya, saya punya alias
alias +='pushd +1'
. Itu tidak bisa berfungsi.3 Dan tambahkan alias
alias sudo='sudo '
. Ditto perintah lain sepertistrace
,gdb
, dll yang mengambil perintah sebagai argumen pertama.4 Lihat juga: fpath. Tentu saja Anda juga dapat melakukan
source ~/.bashrc
atau serupa, tetapi ini sering memiliki efek samping lain.sumber
+
bash. Menariknya, setelah pengujian saya menemukan bahwa di bash Anda dapat membuat+
alias tetapi bukan fungsi, seperti yang Anda katakan, tetapi zsh adalah kebalikannya -+
bisa berupa fungsi tetapi bukan alias.zsh
kamu harus menulisalias -- +='some command here'
.+
itu portable. Lihat spesifikasi POSIX pada Alias Namessudo
penggunaan. Mengenai catatan kaki 4, saya menyimpan alias saya~/.bash_aliases
dan definisi fungsi di dalamnya~/.bash_functions
sehingga saya dapat dengan mudah mengubahnyasource
(tanpa ada bahaya efek samping).Hanya untuk menambahkan beberapa catatan:
Selain itu, Anda bisa menggunakan bentuk sesederhana mungkin, yaitu pertama-tama pertimbangkan alias, lalu fungsi, lalu skrip.
sumber
sudo
. Tapi pertama-tama kamu perlualias sudo='sudo '
.Aturan praktis saya adalah:
sumber
Dalam lingkungan multi-user (atau multi sysamin), saya menggunakan skrip untuk semuanya, bahkan jika itu akhirnya menjadi pembungkus singkat 'exec sesuatu ....'.
Tentu, secara teknis lebih lambat / kurang efisien daripada alias atau fungsi, tapi itu hampir tidak pernah penting - dan asalkan ada di jalurnya, skrip selalu berfungsi.
Fitur Anda dapat dipanggil dari cron, dari sesuatu dengan lingkungan yang diperkecil atau dimodifikasi seperti sudo atau env, atau pengguna mungkin hanya menggunakan shell yang berbeda untuk Anda - semua atau yang kemungkinan akan merusak alias atau fungsi.
Jika Anda memiliki sesuatu yang sensitif terhadap kinerja, tangani itu sebagai kasus khusus, atau lebih baik lagi, pertimbangkan pemicu untuk menulis ulang dalam bahasa skrip yang lebih fungsional.
Jika kita berbicara tentang fitur yang hanya akan digunakan dalam skrip lain, maka Anda juga dapat mempertimbangkan mendefinisikan shell standar, dan menulis skrip fungsi pustaka yang bisa saja. bersumber I untuk semua skrip lainnya.
T
sumber
Contoh untuk Situasi di Mana Anda Paling Mungkin Ingin menggunakan Alias.
Saya tahu ini adalah posting lama tetapi saya ingin menunjukkan situasi di mana saya hampir harus menggunakan kombinasi alias dengan skrip dan saya memilih untuk tidak menggunakan fungsi.
Saya memiliki skrip yang
~/.bin/
disebutsetup
yang melakukan hal berikut: 1Intinya adalah bahwa jika saya hanya menjalankan
setup <project-name>
saya tidak akan memiliki variabel-variabel yang ditentukan dan saya tidak akan mendapatkan ke direktori sama sekali. Solusi saya temukan untuk menjadi yang terbaik adalah untuk menambahkan script ini untukPATH
dan menambahkanalias setup=". ~/.bin/setup"
ke~/.bashrc
atau apa pun.Catatan:
sumber
Kapan menulis skrip
Ketika Anda mungkin ingin menjalankan perintah dari alat selain shell.
Ini termasuk vim (untuk saya): memiliki filter tertulis dan program lain sebagai skrip, saya dapat melakukan sesuatu seperti
:%!my-filter
memfilter file melalui program dari editor saya.Jika
my-filter
fungsi atau alias, itu tidak mungkin.sumber