$ which echo
echo: shell built-in command.
$ which ls
/bin/ls
$ which cat
/bin/cat
Mengapa gema bukan sebuah utilitas independen seperti ls
, ps
, cat
dll? Mengapa itu spesifik shell? Ada alasan bagus?
shell
command-line
shell-builtin
Lazer
sumber
sumber
echo
pasti adalah Bash builtin. Bahkan, itu adalah builtin di setiap shell modern utama.Jawaban:
Ada dua kelas builtin:
Beberapa perintah harus dibangun ke dalam program shell itu sendiri karena mereka tidak dapat bekerja jika itu eksternal.
cd
adalah salah satunya karena jika itu eksternal, itu hanya bisa mengubah direktori sendiri; itu tidak dapat memengaruhi direktori kerja shell saat ini. (Lihat juga: Mengapacd
bukan program? )Kelas perintah lain dibangun ke dalam shell murni untuk efisiensi.
The halaman manual memiliki bagian di builtin yang menyebutkan , , dan sebagai contoh perintah di kelas ini.
dash
printf
echo
test
Sistem Unix selalu menyertakan executable terpisah untuk perintah di kelas kedua itu. Eksekusi terpisah ini masih tersedia di setiap sistem Unixy yang saya gunakan, meskipun mereka juga dibangun di setiap shell yang mungkin Anda gunakan. ( POSIX sebenarnya mengharuskan executable ini hadir.)
Saya percaya telah
echo
dibangun ke dalam shell di AT&T Unix System V Release 3.1. Saya mendasarkannya pada perbandingan dua edisi manual yang berbeda untuk sistem AT & Ts 3B1 seri Unix . Seseorang telah dengan ramah memindai edisi tahun 1986 dari manual ini dan menempatkannya secara online ; ini sesuai dengan rilis asli SVR3. Anda dapat melihat bahwaecho
itu tidak ada dalam daftar di halaman 523 dari Panduan Pengguna Sistem V UNIX, Volume II , di mana Anda akan mengharapkannya jika perintah dibangun ke dalam shell. Dalam salinan koran lokal saya manual SVR3.1 dari tahun 1987,echo
yang tercantum dalam bagian manual.Saya cukup yakin ini bukan inovasi CSRG Berkeley yang dibawa AT&T ke rumah. 4.3BSD keluar tahun yang sama dengan SVR3, 1986, tetapi jika Anda melihat halaman 4.3.1 sh.1 , Anda melihat bahwa
echo
itu tidak ada dalam daftar "Perintah Khusus" daftar perintah built-in. Jika CSRG melakukan ini, itu berarti kita menginginkan sumber yang terdokumentasi untuk membuktikannya.Pada titik ini, Anda mungkin bertanya-tanya apakah
echo
dibangun ke dalam shell lebih awal dari SVR3.1 dan bahwa fakta ini tidak didokumentasikan sampai saat itu. Kode sumber pra-SVR3 AT&T Unix terbaru yang tersedia bagi saya ada di tarball PDP-11 System III , di mana Anda akan menemukan kode sumber shell Bourne. Anda tidak akan menemukanecho
di tabel perintah builtin, yang ada di/usr/src/cmd/sh/msg.c
. Berdasarkan cap waktu di file itu, itu membuktikan bahwaecho
pasti tidak ada di shell pada tahun 1980.Hal sepele
Direktori yang sama juga berisi file yang disebut
builtin.c
yang tidak berisi apa-apa untuk pertanyaan ini, tetapi kami menemukan komentar menarik ini:sumber
print
perintah builtin untuk ksh yang dikatakan berperilaku sepertiecho
. Perintah ini hadir dalam sesuatu seperti AT&T Unix SVR4 2.1 i386 dari ISC juga.print "\012"
menghasilkan hasil yang sama seperti yang akan gema. Bertanya-tanya mengapa ksh memiliki cetakan dan bukan gema bawaan? Bagaimanapun juga sangat menarik.Ada alasan ketiga untuk beberapa perintah menjadi built-in: Perintah dapat digunakan saat menjalankan perintah eksternal tidak mungkin.
Terkadang suatu sistem menjadi sangat rusak sehingga
ls
perintahnya tidak berfungsi. Dalam beberapa kasus,echo *
masih akan berfungsi.Contoh (lebih penting!) Lainnya adalah
kill
: Jika suatu sistem kehabisan PID gratis, tidak mungkin untuk menjalankan/bin/kill
(karena itu membutuhkan PID :-), tetapi built-inkill
akan bekerja.Btw.,
which
Adalah perintah eksternal (setidaknya itu bukan internal di bash), jadi itu tidak bisa daftar perintah internal. Contohnya:sumber
ldconfig
kecuali Anda tahu persis apa yang Anda lakukan). Juga, bagaimana jika Anda meniup / bin Anda, atau lebih buruk, partisi / sbin Anda, tetapi masih memiliki shell dimuat?ps
perintah, jadi Anda harus menemukan PID secara manual/proc
.which
adalah alias bash yang berjalanalias | /usr/bin/which --read-alias ...
sehingga eksternalwhich
dapat mengidentifikasi alias (tapi masih belum builtin). Saya tidak bisa memutuskan apakah akan menganggap ini brilian atau sesat.Menurut Manual Referensi Bash , ini tentang kenyamanan.
The Lanjutan Bash Scripting Guide memiliki penjelasan yang lebih rinci:
Perhatikan juga bahwa
echo
ada sebagai utilitas mandiri pada beberapa sistem. Inilah yang saya miliki di sistem Darwin saya (MacOSX 10.5.8 - Leopard)echo
juga tersedia sebagai builtin, tetapi tampaknya skrip saya menggunakan / bin / echo pada Mac saya, dan menggunakan Bash builtin pada sebagian besar sistem Linux & FreeBSD saya. Tapi itu sepertinya tidak masalah, karena skrip masih bekerja dengan baik di mana-mana.sumber
type
.Untuk melengkapi jawaban bhm, katakanlah secara
/bin
tidak sengaja dihapus dari AndaPATH
. Anda ingin bisaecho $PATH
mengetahuinya, bukan?sumber
Meskipun sebagian besar shell memiliki built-in
echo
saat ini, GNU CoreUtils juga menyertakan implementasi mandiri:Sepertinya Anda tidak menginstal GNU Coreutils (kebanyakan desktop & server OS berbasis linux menginstalnya secara default, tetapi menanamkan linux atau UNIX lain mungkin menggunakan koleksi alternatif utilitas shell sebagai gantinya).
BTW: jika Anda melihat Busybox , Anda akan melihat itu
ls
,ps
dancat
juga merupakan perintah bawaan di sana (atau setidaknya bisa; itu digunakan untuk sistem sematan dan semua yang tidak diperlukan dapat ditinggalkan).sumber
/bin/echo
tidak ada. Mereka hanya menunjukkan bahwa builtin lebih diutamakan daripadaecho
program apa pun di PATH.Inilah alasan sebenarnya mengapa
echo
shell harus dibangun:Misalkan Anda memiliki kata sandi
$PASSWORD
. Bagaimana Anda menulisnya ke file./password
? Secara alami kebanyakan programmer akan menulis:Namun, jika
echo
bukan shell builtin, kata sandi akan bocor ke semua pengguna melaluips
informasi.Tentu saja, jika Anda ingin menjadi pintar tentang hal itu, Anda dapat menemukan cara untuk menyimpan kata sandi tanpa
echo
, mungkin memanfaatkan beberapa fitur shell lainnya:Namun, memiliki
echo
sebagai bawaan adalah sabuk pengaman yang penting karena cara yang paling jelas untuk menyimpan kata sandi ke file juga harus bekerja.sumber