7.1. Perkenalan
Pada bab ini kita akan melihat lingkungan kerja tradisional dari sistem UNIX: shell. Shell adalah sebuah interpreter yang dapat digunakan secara interaktif dan non-interaktif. Ketika shell digunakan pada mode non-interaktif, fungsinya sebagai bahasa pemrograman yang sederhana, namun bagus.
Prosedur untuk menjalankan shell tergantung dari apakah Anda menjalankan login berbasis grafis atau teks. Jika Anda login pada mode teks, maka shell sudah langsung dijalankan setelah memasukkan kata sandi yang benar. Jika Anda menjalankan manajer login grafis seperti KDM, lakukan proses login secara normal, dan lihat pada manajer jendela atau menu desktop untuk sebuah isian bernama “XTerm”, “Terminal” atau “Konsole”. XTerm adalah emulator terminal, setelah emulator terminal dijalankan, shell akan muncul.
Sebelum kita pergi lebih jauh, kami harus harus memperingatkan kepada Anda bahwa Slackware Linux menyediakan lebih dari sekedar satu shell. Terdapat dua rasa shell yang menjadi populer, Bourne shell dan C shell. Pada bab ini kita akan membahas Bourne shells yang sesuai dengan standar IEEE 1003.1. Shell Bash (Bourne Again Shell) dan ksh (Korn Shell) sesuai dengan standar ini juga. Jadi merupakan ide bagus untuk menggunakan salah satu dari dua shell ini. Anda bisa melihat shell yang digunakan pada sistem dengan menjalankan echo $SHELL. Ini yang akan dilaporkan pada shell Bash:
$ echo $SHELL
/bin/bash
Jika Anda menggunakan shell yang berbeda, Anda bisa mengganti shell default Anda. Sebelum mengganti shell yang berbeda, Anda harus menyediakan path lengkap dari shell. Anda bisa melakukannya dengan perintah which. Misalnya:
$ which bash
/bin/bash
$ which ksh
/bin/ksh
Pada sistem Slackware, path lengkap terhadap shell bash adalah /bin/bash
, dan shell ksh /bin/ksh
. Dengan informasi ini, dan perintah chsh Anda bisa mengganti shell default. Contoh berikut mengganti shell default menjadi bash:
$ chsh -s /bin/bash
Changing shell for daniel.
Password:
Shell changed.
Shell baru akan diaktifkan setelah keluar dari shell yang saat ini sedang dipakai (dengan logout atau exit), atau dengan membuka jendela terminal X baru jika Anda menjalankan X11.
7.2. Mengeksekusi perintah-perintah
Shell interaktif digunakan untuk menjalankan program dengan mengeksekusi perintah-perintah. Terdapat dua jenis perintah yang dapat dijalankan shell:
-
Perintah bawaan (built-in): perintah built-in terintegrasi pada shell. Perintah yang paling sering digunakan adalah: cd, fg, bg, dan jobs.
-
Perintah eksternal: perintah eksternal adalah program yang bukan merupakan bagian dari program shell, dan disimpan secara terpisah pada sistem berkas. Perintah yang paling sering digunakan : ls, cat, rm, dan mkdir.
Semua perintah shell dieksekusi dengan sintaks yang sama:
perintah [argumen1 argumen2 ... argumenN]
Jumlah parameter bebas dan selalu dikirimkan ke perintah. Perintah bisa menentukan apa yang harus dilakukan dengan argumen.
Semua perintah built-in selalu dapat dieksekusi, karena merupakan bagian dari shell. Perintah eksternal bisa dieksekusi ketika program masuk didalam pencarian path oleh shell. Jika tidak, Anda harus menentukan path ke program. Pencarian path dari shell disimpan pada variabel bernama PATH. Sebuah varibel adalah bagian dari memory, dimana nilainya bisa diganti. Kita bisa melihat isi dari variabel PATH dengan cara berikut:
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/daniel/bin
Path direktori pada variabel PATH dipisahkan dengan karakter titik dua (:). Anda bisa menggunakan perintah which untuk memeriksa apakah perintah yang diberikan terdapat pada path shell. Anda bisa melakukannya dengan memberikan perintah sebagai argumen bagi which. Sebagai contoh:
$ which pwd
/bin/pwd
$ which sysstat
/usr/bin/which: no sysstat in (/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/daniel/bin)
Jika sebuah program bukan bagian dari path, Anda masih bisa menjalankannya dengan memasukkan path absolut atau relatifnya.
Seringkali kita perlu melompat pada berbagai bagian dari sebuah baris dan mengubahnya, ketika Anda mengedit perintah yang besar. Baik bash dan ksh memiliki jalan pintas (shortcut) untuk melakukan beberapa operasi umum. Terdapat dua mode shell, yang memiliki dua kunci shortcut yang berbeda. Mode ini bersesuaian dengan dua editor UNIX yang populer. Editor ini adalah vi dan emacs. Pada buku ini kita hanya akan membahas kunci EMACS-like. Anda bisa melihat pada mode apa yang digunakan oleh shell yang sedang digunakan dengan mencetak variabel SHELLOPTS. Pada contoh pertama shell digunakan pada mode emacs, pada contoh kedua digunakan mode vi. Anda bisa mengidentifikasi mode dengan melihat pada string emacs atau vi pada isi dari variabel.
$ echo $SHELLOPTS
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
$ echo $SHELLOPTS
braceexpand:hashall:histexpand:history:interactive-comments:monitor:vi
Jika shell Anda menggunakan mode vi, Anda bisa berpindah ke mode emacs dengan menentukan opsi emacs:
$ set -o emacs
Dengan mode pengeditan emacs diaktifkan, Anda bisa menjalankan dengan shortcut. Kita akan melihat tiga jenis shortcut: pengeditan karakter, pengeditan kata, dan pengeditan baris. Pada bagian lain dari bab ini, kita juga akan emlihat pada beberapa shortcut yang digunakan untuk mengambil isian dari sejarah perintah.
7.3.1. Pengeditan karakter
Grup pertama dari shortcut menggunakan karakter sebagai unit logisnya, berarti mereka mengijinkan operasi pengeditan perintah baris pada karakter. Tabel 7.1, “Berpindah per karakter” menyediakan gambaran dari shortcut yang digunakan untuk berpindah melalui baris pada karakter.
Tabel 7.1. Berpindah per karakter
Kunci | Deskripsi |
Ctrl-b | Pindah satu karakter kebelakang. |
Ctrl-f | Pindah satu karakter kedepan. |
Shortcut ini sangat sederhana, dan tidak melakukan hal-hal yang tidak diinginkan. Misalkan Anda sudah menulis baris seperti ini:
find ~/music -name '*.ogg' - -print
Kursor akan berada di akhir. Anda bisa berpindah ke awal baris dengan menekan Ctrl-b:
find ~/music - -name '*.ogg' -print
Anda juga bisa kembali ke akhir baris dengan menekan Ctrl-f. Terdapat kesalahan pada baris ini, karena terdapat satu karakter yang salah (-). Untuk menghilangkan karakter ini, Anda bisa menggunakan salah satu shortcut untuk penghapusan karakter.
Tabel 7.2. Menghapus karakter
Kunci | Deskripsi |
Ctrl-h | Menghapus sebuah karakter sebelum kursor. Hal ini memiliki efek yang sama dengan menggunakan kunci Backspace pada sebagian besar komputer pribadi. |
Ctrl-d | Menghapus karakter pada posisi kursor berada. |
Anda bisa menghapus karakter minus (-) dengan dua cara. Cara pertama adalah dengan memindahkan kursor ke karakter yang akan dihapus:
find ~/music - -name '*.ogg' -print
lalu tekan Ctrl-d dua kali. Hal ini akan menghapus karakter minus, dan spasi yang mengikuti karakter minus:
find ~/music -name '*.ogg' -print
Dengan melihat pada potongan aslinya, pendekatan lain adalah dengan meletakkan posisi kursor pada spasi setelah tanda minus:
find ~/music - -name '*.ogg' -print
lalu menekan Ctrl-h dua kali untuk menghapus dua karakter sebelumnya, yaitu karakter minus dan spasi sebelum karakter minus. Hasilnya akan sama, kecuali kursornya akan berpindah:
find ~/music -name '*.ogg' -print
Salah satu fitur menarik dari shell modern adalah Anda bisa melakukan transposisi (menukar) karakter. Hal ini cukup berguna jika Anda melakukan kesalahan penulisan dimana dua karakter tertukar. Tabel 7.3, “Menukar karakter” mendaftar shortcut untuk pertukaran karakter.
Tabel 7.3. Menukar karakter
Kunci | Deskripsi |
Ctrl-t | Menukar (transposisi) karakter dimana kursor berada dan karakter sebelum kursor. Hal ini berguna untuk memperbaiki kesalahan pengetikan dengan cepat. |
Misalkan Anda sudah menuliskan perintah berikut:
cat myreport.ttx
Ekstensi memiliki kesalahan kesalahan pengetikan karena Anda hendak menuliskan cat myreport.txt
. Hal ini bisa diperbaiki dengan shortcut transposisi karakter. Pertama-tama pindahkan kursor ke karakter kedua dari pasangan karakter yang berada pada urutan yang salah:
cat myreport.ttx
Anda bisa menekan Ctrl-t. Karakter akan ditukar dan kursor akan diletakkan diantara karakter yang dipertukarkan:
cat myreport.txt
Seringkali diperlukan perpindahan pada level karakter. Untungnya shell Korn dan Bash juga bisa berpindah baris pada level kata. Kata adalah urutan dari karakter yang dipisahkan oleh karakter khusus, misalnya spasi. Tabel 7.4, “Berpindah per kata” mendaftar shortcut yang bisa digunakan untuk melakukan navigasi baris per kata.
Tabel 7.4. Berpindah per kata
Kunci | Deskripsi |
Esc b | Pindah ke awal dari kata aktual atau kata sebelumnya. |
Esc f | Pindah maju ke karakter terakhir dari kata aktual atau kata selanjutnya. |
Seperti yang Anda lihat bahwa huruf pada shortcut sama dengan ketika berpindah per karakter. Logika dari perubahan ini cukup menarik. Berpindah kedepan meletakkan kursor di akhir dari kata aktual, bukan pada karakter pertama dari kata selanjutnya seperti yang Anda prediksikan. Mari kita lihat pada sebuah contoh. Pada awalnya kursor berada pada karakter pertama dari sebuah baris.
find ~/music -name '*.ogg' -print
Menekan Esc f akan memindahkan kursor diakhir karakter pertama, yang berupa find pada kasus ini:
find ~/music -name '*.ogg' -print
Maju kedepan sekali akan meletakkan kursor dibelakang ~/music:
find ~/music -name '*.ogg' -print
Perpindahan kebelakang meletakkan kursor di karakter pertama dari kata aktual, atau karakter pertama dari kata sebelumnya jika kursor berada di karakter pertama dari sebuah kata. Jadi berpindah kebelakang satu kata pada contoh sebelumnya akan meletakkan kursor pada kata pertama dari “music”:
find ~/music -name '*.ogg' -print
Menghapus kata memiliki cara kerja yang sama dengan perpindahan kata, tetapi karakter yang ditemukan akan dihapus. Tabel 7.5, “Menghapus kata” mendaftar shortcut yang digunakan untuk menghapus kata.
Tabel 7.5. Menghapus kata
Kunci | Deskripsi |
Alt-d | Menghapus kata, dimulai dari posisi kursor aktual. |
Alt-Backspace | Menghapus setiap karakter dari posisi kursor aktual hingga karakter pertama dari kata yang ditemukan. |
Akhirnya, terdapat beberapa shortcut yang berguna untuk memanipulasi kata. Shortcut ini dapat dilihat pada Tabel 7.6, “Memodifikasi kata”.
Tabel 7.6. Memodifikasi kata
Kunci | Deskripsi |
Alt-t | Menukar (transposisi) kata aktual dengan kata sebelumnya. |
Alt-u | Membuat kata menjadi huruf kapital, dimulai dari kursor aktual. |
Alt-l | Membuat kata menjadi huruf kecil, dimulai dari kursor aktual. |
Alt-c | Membuat karakter aktual menjadi huruf kapital atau karakter pertama dari kata selanjutnya yang ditemukan. |
Transposisi menukar antar kata. Jika kata biasa digunakan, maka perilakunya bisa diprediksi. Misalnya jika kita memiliki baris berikut dengan kursor berada pada “two”
one two three
Transposisi kata akan menukar “two” dan “one”:
two one three
Tetapi jika terdapat karakter bukan kata, shell akan menukar kata dengan kata sebelumnya sambil mempertahankan urutan dari karakter bukan kata. Hal ini cukup berguna untuk mengedit argumen dari sebuah perintah. Misalkan Anda membuat kesalahan, dan mencampurkan ekstensi berkas yang hendak Anda cari dari parameter print:
find ~/music -name '*.print' -ogg
Anda bisa memperbaiki hal ini dengan meletakkan kursor pada kata kedua yang salah, dalam kasus ini “ogg”, dan menukar dua kata tersebut. Hal ini akan memberikan hasil yang kita inginkan:
find ~/music -name '*.ogg' -print
Akhirnya, terdapat beberapa shortcut yang mengubah kapitalisasi dari kata. Shortcut Alt-u membuat semua karakter menjadi huruf kapital, dimulai dari posisi kursor aktual hingga akhir kata. Jadi, jika kita memiliki nama dengan huruf kecil “alice”, membuatnya menjadi huruf besar dengan kursor berada pada “i” memberikan hasil “alICE”. Alt-l memiliki perilaku yang sama, tetapi mengubah huruf menjadi huruf kecil. Jadi menggunakan Alt-l pada “alICE” dengan kursor pada “I” akan mengubahnya menjadi “alice”. Alt-c hanya mengubah karakter dimana kursor berada, atau karakter kata selenjutnya yang ditemukan, menjadi huruf kapital. Sebagai contoh, menekan Alt-c dengan posisi kursor pada “a” dalam kata “alice” akan menghasilkan “Alice”.
Level tertinggi yang bisa kita edit adalah baris itu sendiri. Tabel 7.7, “Berpindah per baris” mendaftar dua shortcut.
Tabel 7.7. Berpindah per baris
Kunci | Deskripsi |
Ctrl-a | Berpindah ke awal baris. |
Ctrl-e | Berpindah ke akhir baris. |
Misalkan kursor berada di tengah-tengah sebuah baris:
find ~/music -name '*.ogg' -print
Menekan Ctrl-e sekali akan memindahkan kursor ke akhir baris:
find ~/music -name '*.ogg' -print
Menekan Ctrl-a akan mmemindahkan kursor ke awal baris:
find ~/music -name '*.ogg' -print
Anda bisa menghapus karakter per baris. Shortcutnya dapat dilihat pada Tabel 7.8, “Menghapus baris”. Shortcut ini bekerja seperti pergerakan, tetapi menghapus karakter yang ditemukan. Ctrl-k akan menghapus karakter dimana kursor itu berada, tetapi Ctrl-x Backspace tidak akan menghapusnya. Berpindah ke awal baris dengan Ctrl-a, diikuti dengan Ctrl-k, adalah untuk menghapus sebuah baris sepenuhnya.
Tabel 7.8. Menghapus baris
Kunci | Deskripsi |
Ctrl-k | Menghapus semua karakter pada baris, dimulai dari posisi kursor. |
Ctrl-x Backspace | Menghapus semua karakter pada baris hingga posisi aktual kursor. |
7.4. Catatan sejarah perintah
Seringkali Anda harus menjalankan perintah yang pernah Anda jalankan sebelumnya. Untungnya, Anda tidak harus mengetikkan semuanya kembali. Anda bisa melihat catatan sejarah dari perintah-perintah yang pernah ditulis dengan kunci panah atas dan bawah. Selain itu, juga dimungkinkan untuk mencari perintah. Menekan Control-r dan mulailah menuliskan perintah yang hendak Anda tulis. Anda akan melihat bahwa bash akan menampilkan perintah yang cocok yang bisa ditemukan. Jika yang ditampilkan bukan yang Anda cari, Anda bisa bisa melanjutkan menuliskan perintah (sampai unik dan ditemukan sebuah kecocokan), atau menekan Control-r sekali lagi untuk mencari kembali. Ketika Anda sudah menemukan perintah yang dicari, Anda bisa mengeksekusinya dengan menekan .
Pelengkap adalah satu fungsi yang paling berguna dalam shell UNIX-like. Misalkan Anda memiliki direktori dengan dua berkas bernama websites
dan recipe
. Dan misalkan Anda hendak melakukan cat pada berkas websites
(cat menampilkan isi sebuah berkas), dengan menentukan websites
sebagai parameter ke perintah cat. Biasanya Anda cukup mengetikkan “cat websites”, dan mengeksekusi perintah. Cobalah untuk mengetikkan “cat w”, dan tekan kunci . Bash akan secara otomatis melengkapi apa yang Anda tulis menjadi “cat websites”.
Tetapi apa yang terjadi jika Anda memiliki berkas yang namanya dimulai dengan karakter yang sama? Misalkan Anda memiliki berkas recipe1.txt
dan recipe2.txt
. Mengetikkan “cat r” dan menekan , Bash akan melengkapi nama berkas sejauh yang bisa dilakukan. Hal ini akan memberikan “cat recipe”. Coba untuk menekan lagi, dan Bash akan memberikan daftar nama berkas yang dimulai dengan “recipe”, dalam hal ini kedua berkas recipe. Pada posisi ini Anda harus membantu Bash mengetikkan karakter selanjutnya dari berkas yang Anda perlukan. Misalkan Anda hendak melakukan cat recipe2.txt
, Anda bisa menekan kunci <2>. Setelah itu tidak ada masalah dalam melengkapi nama berkas, dan menekan akan melengkapi perintah menjadi “cat recipe2.txt”.
Pelengkap ini bekerja pada perintah. Sebagian besar perintah GNU/Linux cukup pendek, sehingga tidak akan banyak berguna.
Merupakan ide yang bagus untuk berlatih dengan pelengkap, karena bisa menghemat banyak penekanan kunci jika Anda bisa memanfaatkannya. Anda bisa membuat beberapa berkas kosong dengan menggunakan perintah touch. Misalkan untuk membuat berkas dengan nama recipe3.txt
, jalankan touch recipe3.txt.
Sebagian besar shell, termasuk Bash dan ksh, mendukung wildcard. Wildcard adalah karakter spesial yang bisa digunakan untuk melakukan pencocokan pola. Tabel berikut menampilkan beberapa wildcard yang umum dipakai. Kita akan melihat pada beberapa contoh untuk memberikan ide tentang bagaimana wildcard bekerja.
Tabel 7.9. Wildcard Bash
Wildcard | Cocok dengan |
* | Sebuah string dari karakter |
? | Karakter tunggal |
[] | Sebuah karakter dalam sebuah array karakter |
7.6.1. Pencocokan string dari karakter
Seperti yang Anda lihat pada tabel diatas, karakter “*” cocok dengan string dari karakter. Sebagai contoh *.html cocok dengan semua yang diakhiri dengan .html, d*.html cocok dengan semua yang diawali dengan d dan diakhiri dengan .html.
Misalkan Anda hendak menampilkan semua berkas pada direktori aktual dengan ekstensi .html, perintah berikut akan melakukan pekerjaan tersebut:
$ ls *.html
book.html installation.html pkgmgmt.html usermgmt.html
filesystem.html internet.html printer.html xfree86.html
gfdl.html introduction.html proc.html
help.html slackware-basics.html shell.html
Kita juga bisa menghapus semua berkas diawali dengan in:
$ rm in*
7.6.2. Pencocokan satu karakter
Wildcard “?” bekerja seperti “*”, tetapi hanya cocok untuk satu karakter saja. Misalkan kita memiliki tiga berkas, file1.txt
, file2.txt
dan file3.txt
. String file?.txt cocok dengan semua berkas ini, tetapi tidak cocok dengan file10.txt
(“10” adalah dua karakter).
7.6.3. Pencocokan karakter dari sekumpulan
Wildcard “[]” cocok dengan semua karakter diantara kurung siku. Misalkan kita memiliki berkas dari contoh sebelumnya, file1.txt
, file2.txt
dan file3.txt
. String file[23].txt cocok dengan file2.txt
dan file3.txt
, tetapi tidak untuk file1.txt
.
Salah satu fitur utama dari shell UNIX-like adalah pengalihan dan pipe. Sebelum kita mulai melihat kedua teknik, kita harus melihat bagaimana perintah UNIX-like bekerja. Ketika sebuah perintah tidak mendapatkan data dari sebuah berkas, maka akan membuka sebuah berkas-pseudo khusus bernama stdin, dan menunggu data yang muncul. Prinsip yang sama bisa diterapkan pada hasil keluaran sebuah perintah, ketika tidak ada alasan khusus untuk menyimpan hasil keluaran ke sebuah berkas, berkas-pseudo stdout akan dibuka untuk keluaran data. Prinsip ini ditampilkan secara sistematis pada Gambar 7.1, “Masukan dan keluaran standar”
Anda bisa melihat stdin dan stdout bekerja dengan perintah cat. Jika cat dimulai tanpa sembarang parameter, maka dia akan menunggu masukkan dari stdin dan menampilkan data yang sama pada stdout. Jika tidak ada pengalihan yang digunakan, masukan dari keyboard akan digunakan untuk stdin, dan keluaran stdout akan dicetak ke terminal:
$ cat
Hello world!
Hello world!
Seperti yang Anda lihat, cat akan mencetak data ke stdout setelah memasukkan data ke stdin menggunakan keyboard.
Shell mengijinkan Anda untuk menggunakan stdin dan stdout menggunakan “<” dan “>”. Data dialihkan ke arah anak panah. Pada contoh berikut kita akan mengalihkan hasil md5 yang dihitung untuk sekumpulan berkas pada sebuah berkas bernama md5sums
:
$ md5sum * > md5sums
$ cat md5sums
6be249ef5cacb10014740f61793734a8 test1
220d2cc4d5d5fed2aa52f0f48da38ebe test2
631172a1cfca3c7cf9e8d0a16e6e8cfe test3
Seperti yang bisa kita lihat pada keluaran perintah cat, hasil keluaran dari perintah md5sum * dialihkan ke berkas md5sums
. Kita juga bisa menggunakan pengalihan untuk menyediakan masukkan ke sebuah perintah:
$ md5sum <>
6be249ef5cacb10014740f61793734a8 -
Hal ini memberikan isi dari test1
ke md5sum.
Anda juga bisa menghubungkan masukan dan keluaran dari perintah menggunakan pipe. Sebuah pipe dapat dibuat dengan karakter “|”. Dua atau lebih perintah yang digabungkan disebut pipeline. Gambar 7.2, “Sebuah pipeline” menampilkan sistematis bagaimana sebuah pipeline yang terdiri dari dua perintah.
“Sintaks” dari pipeline adalah: perintah1 | perintah2 ... | perintahN. Jika Anda tahu bagaimana sebagian besar perintah UNIX bekerja, Anda bisa menggabungkannya. Mari kita lihat dalam sebuah contoh:
$ cat /usr/share/dict/american-english | grep "aba" | wc -l
123
Perintah pertama, cat, membaca berkas kamus /usr/share/dict/american-english
. Hasil keluaran dari perintah cat dikirimkan melalui pipe ke grep, yang akan mencetak semua berkas yang mengandung frase “aba”. Berikutnya, keluaran dari “grep” akan dikirimkan melalui pipe ke wc -l, yang akan menghitung jumlah baris yang diterima dari stdin. Akhirnya, ketika aliran sudah selesai, wc mencetak jumlah baris yang dihitung. Jadi ketiga perintah yang digabung akan menghitung jumlah baris yang mengandung frase “aba” pada kamus ini.
Terdapat banyak sekali utilitas kecil yang menangani tugas-tugas yang spesifik. Seperti yang Anda bayangkan, perintah-perintah ini bisa menyediakan sebuah kotak kerja yang hebat dengan membuat kombinasi dengan pipe