Bagaimana cara mengetahui perintah shell apakah program atau fungsi?

8

Saya ingin tahu apakah perintah yang kita panggil di shell adalah fungsi atau program .

AymenTM
sumber
1
Apa perbedaan yang Anda buat antara "program kecil" dan "fungsi"?
JdeBP
Anda dapat memasukkan perintah ke dalam program shell yang memungkinkan Anda memprogram shell untuk berfungsi dan mengambil perintah dengan memanfaatkan fungsi yang diprogram dengan shell untuk memerintahkan program lain dari fungsi shell.
txtechhelp

Jawaban:

15

Tergantung.

Perintah dapat jatuh ke dalam beberapa kategori: builtin, alias, fungsi, executable (skrip dan binari di jalur pencarian).

Di baris perintah, ini menempati ruang nama tunggal dan datar yang memungkinkan pengesampingan. Ada banyak cara membedakan jenis program:

$ f () { :; }
$ alias a=cat
$ which f
f ()
{ 
    :
}

Kita tahu itu fadalah fungsi.

$ which a
alias a='cat'
        /usr/bin/cat

Kita tahu itu aalias.

$ which yes
/usr/bin/yes

Kami tahu itu yesadalah sebuah program.

$ builtin echo ; echo $?

0

Shell memiliki echobuiltin ...

$ builtin cat ; echo $?
bash: builtin: cat: not a shell builtin
1

... tapi tidak ada untuk cat. Jika ada builtin atau alias tetapi Anda bersikeras memanggil program, awali perintah dengan backslash:

$ builtin true | printf "%d\n" $?
0
$ alias true=false
$ true ; printf "%d\n" $?
1
$ \true ; printf "%d\n" $?
0
phg
sumber
3
Juga, perintah yang merupakan program dalam satu implementasi * nix mungkin menjadi shell builtin (= fungsi) di yang lain.
jamesqf
1
@ jamesqf, yeah, shell memiliki alat standar bawaan, tetapi perintah builtin tidak sama dengan fungsi. Jalankan missh -c 'type true; f() { echo x; }; type f'
ilkkachu
5
Perhatikan bahwa secara umum, typelebih disukai whichuntuk hampir semua tujuan. Lihat unix.stackexchange.com/q/85249/135943
Wildcard
@ilkkachu: Itu tergantung pada definisi Anda tentang "sama dengan". Tentu saja mereka diimplementasikan secara berbeda, tetapi untuk pengguna biasa mengetik perintah, mereka secara fungsional sama.
jamesqf
1
@ jamesqf, bahkan jika pengguna biasa Anda tidak (tahu bagaimana) menggunakan fungsi, mengklaim mereka sama dengan builtin hanya membingungkan.
ilkkachu
4

Definisi a functionadalah mengembalikan nilai tunggal, dan tidak menghasilkan apa pun. Fungsi Shell secara khusus mungkin sangat baik dan dapat memiliki output atau efek samping lainnya, karena nilai pengembalian fungsi sangat terbatas.

A commandadalah instruksi yang diberikan oleh pengguna untuk memberitahu komputer untuk melakukan sesuatu, misalnya, mengeksekusi satu program atau sekelompok program tertaut.

A programadalah urutan instruksi (yaitu perintah) yang diberikan ke komputer dan dapat dimengerti oleh unit pemrosesan pusat (CPU) komputer. petunjuk ini menunjukkan operasi yang harus dilakukan komputer pada sekumpulan data.

Karena itu, functionsadalah bagian logis dari program. Memanggil satu sepenuhnya dalam proses Anda. The commandadalah sebuah program (atau shell built-in) dapat dieksekusi dari shell command. Perintah ini mengimplementasikan fungsi yang melakukan tugas. Yang terjadi adalah sebaliknya.


sumber
10
"suatu fungsi mengembalikan nilai tunggal, dan tidak menghasilkan apa-apa" - well, yeah, dalam arti matematika mungkin. Tetapi dalam bahasa pemrograman imperatif, itu sangat umum untuk "fungsi" berarti hanya subrutin, yang bisa melakukan apa saja. Dan fungsi-fungsi shell secara khusus mungkin memiliki keluaran atau efek samping lain, karena nilai pengembalian fungsi sangat terbatas.
ilkkachu
@ilkkachu. Terima kasih. Saya telah memperbarui jawabannya. Silakan revisi ;-)
3
Saya pikir definisi ini berasal dari konteks bahasa pemrograman, bukan konteks shell. Ya, saya tahu bahasa shell adalah bahasa pemrograman, tetapi gagasannya tentang "fungsi" sangat berbeda dengan definisi matematika atau komputer-sains - di shell, semua perintah (apakah builtin, fungsi, alias, program, atau skrip) bertindak sama, dan hanya jenis implementasi yang berbeda.
Toby Speight
1
... * kebanyakan * sama; builtin dapat mengubah keadaan shell itu sendiri, sedangkan program eksternal tidak dapat memanggil chdir()atau setenv()di shell yang, bagi mereka, proses induk yang berbeda.
Charles Duffy
1

Saya ingin tahu apakah perintah yang kita panggil di shell adalah fungsi atau program?

Iya.

Khususnya, ketika Anda mengetik beberapa teks dan menekan enter, shell harus menentukan apakah itu:

  1. sebuah alias,
  2. sebuah fungsi,
  3. perintah bawaan,
  4. file yang dapat dieksekusi.
RonJohn
sumber