Perintah vs program?

19

Saya mencari perbedaan antara adduserdan useradd, dan penjelasannya adalah itu useraddadalah perintah sedangkan adduserskrip perl. Saya mengerti apa skrip perl, tetapi apa yang saya tidak mengerti adalah apa commandsebenarnya itu.

Saya selalu berpikir bahwa perintah seperti ls, ln, cddll semua program sederhana yang ditulis dalam bahasa apa pun yang hanya melakukan satu hal. Apa perbedaan antara "program sederhana" dan skrip perl ini?

Saya tentu saja tahu bahwa skrip (perl) tidak dikompilasi tetapi ditafsirkan pada saat runtime, tapi saya kira itu bukan satu-satunya perbedaan?

kramer65
sumber
1
jangan terlalu fokus pada kompilasi vs ditafsirkan dalam kasus ini. Anda bisa memiliki shell yang ditafsirkan (meskipun mengapa Anda ingin satu dipertanyakan). sebaliknya fokus pada fakta bahwa kode untuk tindakan perintah adalah bagian statis dari kode sumber shell, sedangkan skrip eksternal, tidak boleh dianggap ada, atau berperilaku sama persis pada dua sistem yang sedikit berbeda, dan mungkin bahkan belum tentu semua ketergantungannya terpenuhi. skrip lebih fleksibel, dan untuk alasan itu, kurang dapat diandalkan secara umum, sedangkan perintah akan bekerja di mana saja shell akan.
Frank Thomas
Dengan kata sederhana: perintah adalah segala sesuatu yang bisa dijalankan sedangkan program adalah biner yang bisa dijalankan.
Pithikos

Jawaban:

32

Secara sederhana, perintah adalah instruksi (atau serangkaian instruksi) yang harus dilakukan oleh komputer.

Perintah yang berdiri sendiri

Utilitas Unix fundamental seperti ls, ln, dll (biasanya) ditulis dalam C dan dikompilasi menjadi executable yang berdiri sendiri program yang tidak memerlukan penerjemah untuk dieksekusi; mereka biasanya memerlukan file pustaka tertentu untuk diinstal pada sistem tetapi itu adalah jawaban untuk pertanyaan lain.

Skrip

Sebuah skrip adalah kumpulan perintah dan pada kenyataannya, skrip itu sendiri dianggap sebagai sebuah perintah.

Sebuah Perl Script adalah urutan pernyataan Perl dan membutuhkan perl(berdiri sendiri dan dikompilasi) executable program yang menafsirkan pernyataan Perl.

Terkadang skrip interpretatif yang besar dan kompleks (dalam bahasa seperti Perl, Python dan Ruby) juga disebut sebagai program yang ditafsirkan sementara skrip istilah dicadangkan untuk skrip yang lebih pendek dan lebih sederhana.

Sebuah shell script adalah urutan perintah lain (semua jenis perintah) dan itu membutuhkan Unix shell seperti Bash untuk menafsirkan script. Dari halaman manual Bash:

Bash adalah penerjemah bahasa perintah yang kompatibel dengan sh yang menjalankan perintah yang dibaca dari input standar atau dari file.

Built-in Shell

Kerang biasanya telah built-in perintah yang tidak berdiri sendiri program atau script. Sebaliknya, mereka adalah bagian dari shell itu sendiri dan dijalankan langsung oleh shell. cdadalah contoh dari perintah bawaan tersebut.

Beberapa kali ada perintah yang ada sebagai shell built-in dan sebagai perintah yang berdiri sendiri pada saat yang sama, misalnya echoperintah.

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

echo pada dirinya sendiri mengeksekusi shell built-in sementara perintah yang berdiri sendiri dapat dieksekusi dengan menyediakan path lengkapnya.

Jalankan versi internal gema:

$ echo --version
--version

Jalankan echoprogram yang berdiri sendiri :

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Catatan: Spesifikasi di atas merujuk ke lingkungan Unix tetapi prinsip yang sama berlaku untuk lingkungan Windows.

Anthony G - keadilan untuk Monica
sumber
Gema yang Anda rujuk di windows hanya jika Anda menginstal Cygwin. Anda tidak akan menemukan gema. * Di windows karena itu murni perintah shell CMD (gema di powershell alias dituliskan ke objek)
Jim B
@ JimB Itu benar. Saya mengedit baris terakhir untuk menjelaskan apa yang saya maksud. Secara kebetulan, saya baru saja mulai mempelajari PowerShell minggu ini (syukurlah, saya tidak harus bekerja dengan .batfile dalam banyak, bertahun-tahun).
Anthony G - keadilan untuk Monica
2

Perintah bawaan adalah bagian dari shell. Suatu program dijalankan oleh shell.

Perintah builtin terdapat di dalam shell itu sendiri. Ketika nama perintah builtin digunakan sebagai kata pertama dari perintah sederhana (lihat Perintah Sederhana ), shell mengeksekusi perintah secara langsung, tanpa memanggil program lain. Perintah builtin diperlukan untuk mengimplementasikan fungsionalitas yang tidak mungkin atau tidak nyaman untuk didapatkan dengan utilitas terpisah.

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands

Steven
sumber
Tapi useraddbukan shell built-in. Situs web itu hanya mengatakan "perintah", bukan "perintah bawaan". Bagaimana penjelasan ini relevan dengan pertanyaan ini?
Barmar
1

Perintah hanya berarti cara untuk memberitahu aplikasi atau sistem untuk melakukan sesuatu.

Suatu aplikasi biasanya akan menerima banyak perintah berbeda, baik dari GUI, dari stdin, tetapi metode lain dimungkinkan, misalnya soket UNIX atau pipa bernama, semacam API web, koneksi RPC, atau beberapa protokol khusus lainnya.

Aplikasi yang hanya melakukan satu hal, lalu keluar, biasanya tanpa GUI, juga dapat disebut sebagai perintah, karena Anda hanya dapat "memberikan" aplikasi ini satu "perintah" yang berarti. Ini adalah bagaimana program kecil suka lsdan itu bekerja dan mengapa mereka disebut perintah.

Tapi Anda tidak akan menyebut perintah Photoshop, tetapi Anda pasti akan mengeluarkan perintah di dalamnya melalui GUI.

Namun, istilah ini dapat memiliki arti yang berbeda bagi orang yang berbeda. Dalam contoh Anda, perintah sedang digunakan untuk menggambarkan yang dapat dieksekusi yang dijalankan secara langsung, versus file yang membutuhkan penerjemah skrip untuk bekerja. Perbedaannya bisa penting karena ketika Anda menjalankan skrip Perl, /usr/bin/perladalah biner yang benar-benar berjalan (jadi jika Anda ingin membunuh skrip Perl yang berjalan lama, itulah yang harus Anda cari ps). Namun, sebagian besar shell memiliki perintah "built-in" yang merupakan perintah untuk shell itu sendiri dan tidak menyebabkan eksekusi eksternal untuk dijalankan. Misalnya, cdditangani bashsendiri dan tidak dipanggil /sbin/cdatau serupa.

LawrenceC
sumber
Perspektif yang menarik. Pada tingkat abstraksi Anda melihat ini dari, saya tergoda untuk menyebutnya 'doa' atau 'gerakan' atau bahkan untuk pergi dengan terminologi android 'niat'. Yang mengatakan saya tidak tahu apakah saya suka ide membuat dikompilasi vs menafsirkan kriteria. Powershell misalnya adalah hybrid-interpreted (, Net), tetapi sebagai shell, ia memiliki perintah di dalam basis kode. tetapi kemudian Anda membuat poin yang bagus tentang executable yang dikompilasi (kode mesin) eksternal berbeda dari skrip, tetapi juga perintah. seperti yang saya katakan, perspektif yang menarik.
Frank Thomas