Topik ini mendefinisikan shell, yaitu program penerjemah perintah yang menjadi antarmuka teks utama sistem UNIX, beserta posisinya di antara terminal (program penyedia jendela teks) dan kernel (inti sistem operasi). Alasan shell ditemukan di hampir setiap mesin yang menjalankan perangkat lunak sisi server juga diuraikan di dalamnya. Setiap definisi disertai perintah sederhana agar dapat diuji langsung dari terminal.
Definisi shell#
Shell adalah program yang membaca perintah teks dari masukan pengguna, menafsirkan maksudnya, lalu menjalankannya. Namanya berarti kulit karena program ini menjadi lapisan terluar yang membungkus kernel, sementara pengguna tidak pernah berbicara langsung dengan kernel. Seluruh percakapan berlangsung melalui shell, yang menerjemahkan teks perintah menjadi pekerjaan yang dikerjakan sistem, seperti meluncurkan program atau membaca berkas.
Kerja shell mengikuti satu putaran yang berulang terus-menerus. Shell mencetak prompt, yaitu rangkaian karakter penanda bahwa perintah baru siap diketik, kemudian membaca satu baris masukan. Baris tersebut diuraikan menjadi kata-kata, lalu shell menjalankan perintahnya, baik perintah yang dikenali langsung maupun program terpisah yang dicari di sistem. Apabila perintah tidak dikenal, shell menampilkan pesan error, yaitu laporan bahwa perintah gagal, dan putaran dimulai kembali dari prompt.
Contoh berikut menunjukkan putaran tersebut dalam bentuk paling sederhana. Perintah echo diteruskan shell untuk mencetak teks ke keluaran, dan hasilnya langsung terlihat tanpa menulis berkas terlebih dahulu.
# shell membaca perintah, lalu program echo mencetak teks ke keluaran
echo "Halo dari shell"Halo dari shellKeluaran muncul tepat setelah perintah dieksekusi, lalu shell siap menerima perintah baru. Pola yang sama berlaku untuk perintah apa pun, mulai dari mencetak teks hingga menjalankan program pengolah berkas. Seluruh komunikasi berupa teks, dan gaya antarmuka semacam ini disebut command line (antarmuka yang seluruh masukan dan keluarannya berupa teks).
Posisi shell di antara terminal dan kernel#
Shell tidak bekerja sendirian. Pada sesi interaktif, shell berjalan di dalam terminal, sedangkan jendela yang terlihat oleh pengguna adalah milik terminal, bukan milik shell. Ketika sebuah perintah memerlukan sumber daya sistem, misalnya membaca berkas atau membuat proses baru, shell meneruskan permintaan tersebut ke kernel. Kernel-lah yang benar-benar mengeksekusi pekerjaan itu pada perangkat keras.
Pengguna kemudian membaca jawabannya di jendela yang sama, sehingga satu perintah singkat melewati empat perhentian sebelum keluarannya sampai ke layar. Diagram berikut merangkum posisi pengguna, terminal, shell, dan kernel, dengan panah atas untuk arah perintah yang diketik pengguna dan panah bawah untuk arah keluaran teks yang kembali ke layar.
Susunan ini menjelaskan satu sifat penting shell, yaitu shell hanyalah program biasa, bukan bagian tersembunyi dari sistem operasi. Program ini diluncurkan seperti program lain, dapat diganti dengan shell lain, dan dapat berjalan tanpa jendela sama sekali, misalnya ketika sebuah skrip dieksekusi oleh sistem. Seluruh kemampuan yang melekat padanya, seperti mengelola variabel dan meluncurkan program, berasal dari kode shell itu sendiri. Kernel hanya menyediakan layanan dasar yang diminta oleh shell.
Lingkungan pemrograman yang paling universal#
Shell menjadi lingkungan pemrograman yang paling universal karena tersedia di hampir semua mesin yang menjalankan perangkat lunak sisi server. Setiap server Linux memiliki shell yang siap digunakan untuk administrasi. Layanan CI (continuous integration, sistem yang menguji kode secara otomatis pada setiap perubahan) menjalankan langkah-langkah pemeriksaannya melalui shell di setiap mesinnya. Sebagian besar container (lingkungan eksekusi yang terisolasi) juga menyertakan setidaknya satu shell untuk keperluan diagnosis ketika aplikasi di dalamnya perlu diperiksa.
Sifat universal ini memiliki konsekuensi praktis yang besar. Perintah yang ditulis hari ini tetap dapat berjalan pada mesin lain bertahun-tahun kemudian, karena antarmuka shell dijaga tetap stabil dari satu dekade ke dekade berikutnya. Skrip yang dibangun di atas shell juga berperan sebagai alat penyambung yang menggabungkan program-program kecil menjadi rangkaian kerja yang utuh. Karena itulah keterampilan shell bertahan lama, meskipun teknologi di sekitarnya terus berganti.
Perintah berikut mencetak nama sistem operasi tempat shell berjalan, tanpa memandang distribusi maupun versinya.
# nama sistem operasi tempat shell ini berjalan
uname -sLinuxKeluaran yang sama akan diperoleh di server, di mesin CI, dan di container berbasis Linux. Perintah semacam ini menjadi titik awal yang aman untuk skrip yang berpindah-pindah mesin, karena keluarannya bergantung pada sistem, bukan pada konfigurasi tertentu.
Keluarga shell#
Shell bukan satu program tunggal, melainkan keluarga program dengan perilaku yang serupa. Pelopornya adalah Bourne shell (sh) yang ditulis oleh Stephen Bourne di Bell Labs dan dirilis bersama UNIX versi ketujuh pada 1979. Penerusnya berkembang ke banyak arah, antara lain C shell dengan sintaks menyerupai bahasa C dan Korn shell yang menggabungkan keunggulan Bourne shell dan C shell. Standar POSIX (standar antarmuka sistem UNIX yang menjaga portabilitas antarsistem) kemudian menetapkan perilaku minimum yang dipatuhi shell modern.
Pada 1989, Brian Fox menulis bash untuk proyek GNU sebagai penerus bebas Bourne shell, dan namanya merupakan kepanjangan dari Bourne-Again SHell. Perintah-perintah dari Bourne shell tetap dikenali oleh bash, sehingga skrip lama masih berjalan. Saat ini bash menjadi shell default pada sebagian besar distribusi GNU/Linux. Sistem macOS sejak 2019 menjadikan zsh sebagai shell default, tetapi bash tetap tersedia di dalamnya, sedangkan Debian dan Ubuntu menggunakan dash yang ringan untuk peran /bin/sh.
# berkas shell mana yang sesungguhnya menyandang nama sh di sistem ini
readlink -f /bin/sh/usr/bin/dashPada sandbox ini, nama /bin/sh menunjuk ke dash. Pada sistem lain, jalur yang sama dapat menunjuk ke bash atau shell lainnya, sesuai keputusan distribusinya. Fakta ini penting ketika menulis skrip, karena perintah yang tersedia di bash belum tentu tersedia di shell lain yang menyandang nama sh.
Kesalahan umum#
Kesalahan pertama yang sering terjadi adalah menganggap terminal dan shell sebagai satu hal yang sama. Kedua program memang tampil menyatu dalam satu jendela, tetapi tanggung jawabnya berbeda. Terminal mengurus jendela, font, dan tampilan teks, sedangkan shell membaca serta menafsirkan perintah. Akibat kekeliruan ini, pengaturan yang dimaksudkan untuk shell sering dicari di menu pengaturan terminal, atau sebaliknya. Perbedaannya mudah diuji, karena menutup jendela terminal mengakhiri tampilan, sedangkan shell tetap dapat diluncurkan lagi dari terminal baru.
Kesalahan kedua adalah percaya bahwa echo $SHELL menunjukkan shell yang sedang berjalan. Variabel $SHELL berisi shell login, yaitu shell yang diluncurkan saat pengguna masuk ke sistem, dan nilainya tidak berubah meskipun shell lain dijalankan setelahnya. Untuk mengetahui shell yang benar-benar sedang menafsirkan perintah, tanyakan pada sistem operasi proses mana yang menangani baris perintah ini.
# nama program dari proses yang menjalankan perintah ini
ps -o comm= -p $$bashPerintah ps menampilkan informasi proses, dan flag -p $$ memilih proses shell itu sendiri. Keluaran bash mengonfirmasi bahwa perintah dijalankan oleh bash, tanpa bergantung pada isi $SHELL.
Ringkasan#
- Shell adalah program penerjemah perintah yang membaca teks, menguraikannya, lalu menjalankannya, dan bekerja di antara terminal sebagai penyedia jendela serta kernel sebagai pelaksana.
- Shell berupa program biasa yang dapat diganti, sehingga terdapat banyak anggota keluarga shell, dari Bourne shell, bash, zsh, hingga dash.
- Shell tersedia di hampir semua server, mesin CI, dan container, sehingga keterampilan menulisnya bertahan lintas mesin dan lintas waktu.
Referensi#
- GNU Bash Reference Manual — Free Software Foundation — Dokumentasi resmi bash yang mendefinisikan shell beserta konvensi penamaannya.
- The GNU Bourne-Again Shell — Chet Ramey — Halaman resmi bash yang memuat riwayat singkat pengembangannya sejak 1989.
- The Linux Command Line — William Shotts — Bab pembuka memperkenalkan shell sebagai antarmuka percakapan teks dengan komputer.