Di Bash, kapan harus alias, kapan harus skrip, dan kapan harus menulis fungsi?

360

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 .bashrcfile)

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 +xitu, 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.

ixtmixilix
sumber
5
kemungkinan duplikat dari fungsi bash vs skrip
Gilles
10
+1 untuk pernyataan secara eksplisit semua himpunan bagian {alias, skrip, fungsi} di mana pertanyaan ini tidak bertujuan. +1 untuk keyakinan seperti anak kecil bahwa tidak masalah bagi Anda untuk menghapus bagian nol.
Thomas L Holaday
1
Meskipun pertanyaan khusus diajukan tentang bash, perhatikan bahwa cangkang Bourne yang lebih lama memiliki 'alias' tetapi tidak berfungsi. Ini mungkin membuat perbedaan jika Anda khawatir tentang kompatibilitas.
AndyB
Jika .bashrc benar-benar tempat terbaik, atau setidaknya tempat yang solid, untuk ini? Ada begitu banyak cara untuk melakukan hal yang sama di Linux, yang saya hargai, bagaimanapun, semua hal dianggap sama, saya lebih suka melakukan hal-hal dengan cara yang paling umum.
Kit10

Jawaban:

242

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

# Make ls output in color by default.
alias ls="ls --color=auto"
# make mv ask before overwriting a file by default
alias mv="mv -i"

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 grepperilaku default tergantung pada apakah itu ada dalam jalur pipa:

grep() { 
    if [[ -t 1 ]]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

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:

if [ -d ~/.bash_functions ]; then
    for file in ~/.bash_functions/*; do
        . "$file"
    done
fi

Sebuah skrip harus berdiri sendiri. Itu harus memiliki nilai sebagai sesuatu yang dapat digunakan kembali, atau digunakan untuk lebih dari satu tujuan.

Kevin
sumber
14
Penting juga untuk diingat bahwa - kecuali bersumber dengan .atau source- 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.
Will Vousden
260

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 ¹

  • Seluruh isi alias dan fungsi disimpan dalam memori shell.
  • Konsekuensi alami dari ini adalah alias dan fungsi hanya dapat digunakan oleh shell saat ini, dan bukan oleh program lain yang Anda dapat meminta dari shell seperti editor teks, skrip, atau bahkan turunan turunan dari shell yang sama.
  • Alias ​​dan fungsi dieksekusi oleh shell saat ini, yaitu dijalankan di dalam dan memengaruhi lingkungan shell saat ini. ² Tidak diperlukan proses terpisah untuk menjalankan alias atau fungsi.

Skrip

  • Kerang tidak menyimpan skrip dalam memori. Alih-alih, skrip dibaca dari file tempat mereka disimpan setiap kali dibutuhkan. Jika skrip ditemukan melalui $PATHpencarian, banyak shell menyimpan hash dari nama jalurnya dalam memori untuk menghemat waktu pada $PATHpencarian 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 shell source,. 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 bashini .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=valuepasangan yang sering berisi pengaturan konfigurasi global, seperti LANGuntuk lokal default dan PATHuntuk menentukan jalur pencarian yang dapat dieksekusi.

jw013
sumber
26
IMHO Ini adalah jawaban terbaik.
Luc M
4
Format pertanyaan / jawaban adalah ide bagus. Saya mungkin mencuri itu. ;-)
Mikel
4
Patut dicatat: jika dua (atau lebih) skrip perlu membagikan beberapa kode, mungkin yang terbaik adalah memasukkan kode itu ke dalam fungsi yang terletak di file ketiga yang diimpor oleh kedua skrip tersebut.
kbolino
3
Item lain untuk ditambahkan ke daftar pertanyaan: Apakah Anda perlu mengubah fungsionalitas dalam perintah saat itu juga? perubahan pada skrip akan tercermin dalam semua sesi, sedangkan fungsi dan alias harus dimuat ulang atau didefinisikan ulang berdasarkan per sesi.
Stratus3D
3
Jawaban yang bagus. Satu hal yang lebih penting (bagi saya): ketika membuat "jalan pintas" ke utilitas lain, lebih baik menggunakan alias karena autocomplete yang ada hanya akan bekerja dengan alias, tetapi tidak dengan skrip atau fungsi (jadi +1 untuk alias). mis. Dengan membuat alias g='gradle'saya mendapatkan pelengkapan otomatis bertahap saat menggunakan galias saya , tetapi tidak akan mengeluarkannya saat menggunakan skrip dengan gradle $*atau fungsi dengangradle $@
Yoav Aharoni
37

Saya pikir itu terserah selera masing-masing orang. Bagi saya logikanya seperti ini:

  • Pertama saya mencoba membuat alias, karena itu yang paling sederhana.
  • Jika masalahnya terlalu rumit untuk dimasukkan dalam satu baris, saya mencoba membuatnya berfungsi.
  • Ketika fungsi mulai tumbuh di luar selusin baris saya memasukkannya ke dalam skrip.

Sebenarnya tidak ada yang membatasi Anda untuk melakukan sesuatu yang berhasil .

phhehehe
sumber
6
Saya sering melewatkan opsi fungsi, dan segera membuat skrip. Tetapi saya setuju bahwa itu sebagian masalah selera
Bernhard
2
Suatu fungsi mulai masuk akal jika Anda membutuhkannya dalam beberapa skrip.
Nils
7
... atau jika Anda memerlukan efek samping untuk mengubah cangkang saat ini .
glenn jackman
masuk akal, bung!
penjelajah
15

Setidaknya sebagian karena masalah selera pribadi. Di sisi lain ada beberapa perbedaan fungsional yang jelas:

  • alias: hanya cocok untuk penggantian teks sederhana, tanpa argumen / parameter
  • fungsi: mudah ditulis / digunakan, kemampuan skrip shell lengkap, hanya tersedia di dalam bash
  • skrip: lebih atau kurang suka fungsi, tetapi tersedia (bisa dipanggil) di luar bash juga

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 jika bashscriptnametidak dalam $ PATH, sederhana alias c=/path/to/scriptakan cukup.

nohillside
sumber
1
Dalam alias command="bash bashscriptname"skrip tidak harus harus dieksekusi; di alias c=/path/to/scriptitu harus.
Martin - マ ー チ ン
Tidak benar sama sekali bahwa fungsi "hanya tersedia di dalam Bash". Jika Anda bermaksud mengatakan bahwa itu adalah fitur Bash-only, itu hanya salah (shell Bourne dan setiap turunan yang kompatibel memilikinya); dan jika Anda bermaksud mengatakan bahwa mereka adalah fitur dari shell interaktif, itu juga tidak akurat (meskipun alias, variabel, dan fungsi yang didefinisikan dalam file yang dimuat saat startup oleh shell interaktif jelas tidak akan dimuat oleh shell noninteraktif).
tripleee
@tripleee Artinya lebih seperti "Anda tidak bisa menjalankan exec()fungsi" :-)
nohillside
11

Berikut beberapa poin tambahan tentang alias dan fungsi:

  • Nama alias dan fungsi yang sama dapat hidup berdampingan
  • alias namespace dicari terlebih dahulu (lihat contoh pertama)
  • alias tidak bisa (tidak) diatur dalam subkulit atau lingkungan non-interaktif (lihat contoh kedua)

Sebagai contoh:

alias f='echo Alias'; f             # prints "Alias"
function f { echo 'Function'; }; f  # prints "Alias"
unalias f; f                        # prints "Function"

Seperti yang bisa kita lihat, ada ruang nama terpisah untuk alias dan fungsi; lebih banyak detail dapat ditemukan menggunakan declare -A -p BASH_ALIASESdan declare -f f, yang mencetak definisi mereka (keduanya disimpan dalam memori).

Contoh yang menunjukkan batasan alias:

alias a='echo Alias'
a        # OK: prints "Alias"
eval a;  # OK: prints "Alias"
( alias a="Nested"; a );  # prints "Alias" (not "Nested")
( unalias a; a );         # prints "Alias"
bash -c "alias aa='Another Alias'; aa"  # ERROR: bash: aa: command not found

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:

alias a_complex_thing='f() { do_stuff_in_function; } f'

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.

leden
sumber
10

Kapan menulis skrip ...

  • Script merakit komponen perangkat lunak (alias alat, perintah, proses, executable, program) menjadi komponen yang lebih kompleks, yang dapat dirakit menjadi komponen yang lebih kompleks.
  • Skrip biasanya dibuat dapat dieksekusi sehingga mereka dapat dipanggil dengan nama. Saat dipanggil, subproses baru muncul untuk menjalankan skrip. Salinan exportvariabel dan / atau fungsi ed apa pun diteruskan oleh nilai ke skrip. Perubahan pada variabel-variabel tersebut tidak disebarkan kembali ke skrip induk.
  • Skrip juga dapat dimuat (bersumber) seolah-olah mereka adalah bagian dari skrip panggilan. Ini analog dengan apa yang beberapa bahasa lain sebut "impor" atau "sertakan". Ketika bersumber, mereka mengeksekusi dalam proses yang ada. Tidak ada subproses yang muncul.

Kapan harus menulis fungsi ...

  • Fungsinya adalah skrip shell yang sudah dimuat sebelumnya. Mereka melakukan sedikit lebih baik daripada memanggil skrip yang terpisah, tetapi hanya jika itu harus dibaca dari disk mekanik. Proliferasi flashdrives, SSD, dan caching normal Linux saat ini dalam RAM yang tidak digunakan membuat peningkatan ini sebagian besar tidak dapat diukur.
  • Fungsi berfungsi sebagai prinsip prinsip bash untuk mencapai modularitas, enkapsulasi, dan penggunaan kembali. Mereka meningkatkan kejelasan, keandalan, dan pemeliharaan skrip.
  • Aturan sintaks untuk memanggil fungsi identik dengan memanggil executable. Fungsi dengan nama yang sama dengan executable akan dipanggil alih-alih executable.
  • Fungsi bersifat lokal pada skrip tempat mereka berada.
  • Fungsi dapat diekspor ( disalin oleh nilai ) sehingga dapat digunakan di dalam skrip yang disebut. Dengan demikian, fungsi hanya menyebar ke proses anak, tidak pernah orang tua.
  • Fungsi membuat perintah yang dapat digunakan kembali yang sering kali dirangkai menjadi pustaka (skrip dengan hanya definisi fungsi) yang akan dipasok oleh skrip lain.

Kapan menulis alias ...

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 ...

# A bash in-script 'alias'
function oldFunction () { newFunction "$@"; }
DocSalvager
sumber
9

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()dan exec(). 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 $PATHuntuk shell saat ini, tetapi skrip tidak bisa, karena itu beroperasi pada salinan fork / exec $PATH.

Jan Steinman
sumber
Bagaimana penyebaran fungsi ini kepada anak-anak bekerja?
HappyFace
1
@HappyFace Di Bash Anda dapat export -fsuatu fungsi, meskipun cara kerja yang tepat dari ini agak tidak jelas. Ini tidak portabel untuk shell Bourne tradisional saya percaya.
tripleee
7

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.

Pengguna tidak diketahui
sumber
5

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 ~/.envdan atur export 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 seperti strace, gdb, dll yang mengambil perintah sebagai argumen pertama.

4 Lihat juga: fpath. Tentu saja Anda juga dapat melakukan source ~/.bashrcatau serupa, tetapi ini sering memiliki efek samping lain.

Mikel
sumber
1
Saya tidak tahu Anda bisa alias +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.
Kevin
Di dalam zshkamu harus menulis alias -- +='some command here'.
Mikel
Entah bagaimana, saya tidak berpikir aliasing +itu portable. Lihat spesifikasi POSIX pada Alias ​​Names
jw013
3
Suara positif untuk menutupi sudopenggunaan. Mengenai catatan kaki 4, saya menyimpan alias saya ~/.bash_aliasesdan definisi fungsi di dalamnya ~/.bash_functionssehingga saya dapat dengan mudah mengubahnya source(tanpa ada bahaya efek samping).
Anthony Geoghegan
3

Hanya untuk menambahkan beberapa catatan:

  • Hanya skrip terpisah yang dapat digunakan dengan sudo (seperti jika Anda perlu mengedit file sistem), misalnya:
sudo v /etc/rc.conf  #where v runs vim in a new terminal window;
  • Hanya alias atau fungsi yang dapat menggantikan perintah sistem dengan nama yang sama (dengan asumsi Anda menambahkan dir skrip Anda ke akhir PATH, yang menurut saya disarankan untuk keamanan jika terjadi pembuatan skrip yang tidak disengaja atau jahat dengan nama yang identik dengan perintah sistem), sebagai contoh:
alias ls='ls --color=auto'  #enable colored output;
  • Alias ​​dan fungsi membutuhkan lebih sedikit memori dan waktu untuk dieksekusi, tetapi membutuhkan waktu untuk memuat (karena shell harus menginterpretasikan semuanya sebelum menunjukkan kepada Anda prompt). Pertimbangkan ini jika Anda menjalankan proses shell baru secara teratur, misalnya:
# pressing key to open new terminal
# waiting for a few seconds before shell prompt finally appears.

Selain itu, Anda bisa menggunakan bentuk sesederhana mungkin, yaitu pertama-tama pertimbangkan alias, lalu fungsi, lalu skrip.

corvinus
sumber
5
Alias ​​juga dapat digunakan dengan sudo. Tapi pertama-tama kamu perlu alias sudo='sudo '.
Mikel
Memang benar bahwa mengeksekusi skrip akan secara sementara mengkonsumsi lebih banyak memori selama durasi fork + exec, memiliki banyak kode yang dimuat ke dalam memori instance shell saat ini membuatnya menghabiskan lebih banyak memori ke depan, sering kali untuk menyimpan kode yang hanya terbiasa cukup jarang.
tripleee
2

Aturan praktis saya adalah:

  • alias - satu perintah, tanpa parameter
  • fungsi - satu perintah beberapa parameter
  • skrip - beberapa perintah, tanpa parameter
Michael Durrant
sumber
1

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

tjb63
sumber
0

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/disebut setupyang melakukan hal berikut: 1

  1. membawa saya ke direktori tertentu.
  2. mendefinisikan beberapa variabel.
  3. mencetak pesan tentang keadaan direktori. 2

Intinya 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 untuk PATHdan menambahkan alias setup=". ~/.bin/setup"ke ~/.bashrcatau apa pun.

Catatan:

  1. Saya menggunakan skrip untuk tugas ini dan bukan fungsi bukan karena ini sangat panjang tetapi karena saya bisa mengeditnya dan saya tidak perlu sumber file setelah edit jika saya ingin menyegarkan penggunaannya.
  2. Kasus serupa terjadi pada saya ketika saya membuat skrip untuk memuat ulang semua dotfile saya. 3
  1. Script tersedia di repositori dotfiles saya di bawah .bin/.
  2. Tentang skrip : Saya memberikan skrip ini argumen yang merupakan nama untuk proyek yang saya definisikan di lanjutan. Setelah itu skrip tahu untuk membawa saya ke direktori yang benar sesuai dengan csvfile tertentu . Variabel yang didefinisikan diambil dari makefile di direktori itu. Script berjalan setelahnya ls -ldan git statusuntuk menunjukkan kepada saya apa yang terjadi di sana.
  3. Script itu juga tersedia di repositori dotfiles saya .bin/juga.
Doron Behar
sumber
1
Hm, sepertinya itu hanya sebuah fungsi, bukan kombinasi alias-skrip. (BTW, lingkungan dieja "lingkungan" bukan "lingkungan.")
Wildcard
Terima kasih telah mengomentari tentang kesalahan ketik, saya akan memperbaikinya pada komit berikutnya. Sedangkan untuk menggunakan fungsi, bukan skrip - mungkin saya akan menggunakan fungsi untuk tugas khusus ini dan membuang alias ini. Intinya adalah bahwa kadang-kadang cukup mudah untuk menggunakan skrip dan alias jika Anda mengedit skrip itu dari waktu ke waktu .
Doron Behar
0

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-filtermemfilter file melalui program dari editor saya.

Jika my-filterfungsi atau alias, itu tidak mungkin.

D. Ben Knoble
sumber