Saturday, July 28, 2007

Otomatisasi dengan skrip shell (bagian 1)

Priyadi Iman Nurcahyo
Majalah InfoKomputer
Juli 2000

Anda dapat menggunakan Linux tanpa menyentuh antarmuka command line, namun dengan command line anda dapat melakukan banyak hal yang tidak mungkin dilakukan di antarmuka grafis (GUI). Anda pun dapat mengotomatisasi pekerjaan-pekerjaan yang pada kondisi biasa memerlukan anda untuk berhadapan langsung di depan komputer.
Di saat Linux mendapatkan tampilan yang menarik dan semakin mudah untuk digunakan, namun perintah-perintah command line tetap digemari oleh penggunanya karena banyak sekali pekerjaan yang akan jauh lebih efisien dan efektif jika dikerjakan dengan command line.
Kelebihan lainnya dari perintah command line adalah mudah untuk diotomatisasi, misalnya anda dapat menjalankannya pada saat komputer anda booting, pada saat login, atau pada waktu tertentu. Selain itu perintah command line akan lebih berguna jika anda perlu untuk mengakses komputer lain yang jaraknya jauh, anda tidak akan menggunakan tampilan grafis untuk mengakses server anda yang berada di Amerika, misalnya.
Vendor sistem operasi lain sering menyebarkan isu bahwa command line adalah salah satu kelemahan Linux (dan sistem operasi UNIX lain pada umumnya) karena sulit untuk digunakan dan tidak user friendly. Namun jika anda telah menguasai command line di Linux, anda akan mendapatkan bahwa command line bukanlah kelemahan, melainkan kelebihan dari Linux. Isu tersebut hanyalah trik-trik marketing dari pihak-pihak yang tidak menginginkan kesuksesan Linux (dan UNIX lainnya).
Bagi anda yang telah berpengalaman pada command line pada sistem operasi DOS atau Windows (command.com pada DOS dan Windows95/98 atau cmd.exe pada Windows NT), anda tentunya sering menemui kebuntuan dalam memecahkan masalah. Anda akan menemui bahwa command line pada Linux lebih fleksibel dan mudah untuk digunakan.
Bash, shell standard pada Linux
Lingkungan command line yang paling umum ditemukan di sistem Linux adalah Bourne Again Shell (bash). Bash dibuat oleh Brian Fox dari Free Software Foundation. Bash merupakan pengembangan dari Bourne Shell (sh) dan Korn Shell (ksh) dari sistem UNIX, sehingga bash cukup kompatibel dengan skrip-skrip yang ditemukan di sistem UNIX lainnya. Selain bash, Linux juga memiliki beberapa shell lainnya seperti tcsh, ash dan zsh. Artikel ini hanya akan membahas shell yang paling umum digunakan, yaitu bash.
Shell adalah software yang memberikan interaksi pada pengguna komputer, anda menggunakan shell jika anda melakukan login pada console Linux, atau membuka xterm pada X Window System.
Membuat skrip shell
Skrip shell adalah kumpulan perintah-perintah yang akan dieksekusi. Skrip shell mirip dengan batch file pada sistem DOS dan Windows. Selain itu skrip shell juga memiliki konstruksi seperti halnya bahasa pemrograman pada umumnya, misalnya: while, for, switch, if, fungsi dan lain-lain.
Anda membuat skrip shell dengan menggunakan editor teks seperti halnya vi, pico, gedit, joe atau emacs. Pilihlah teks editor yang paling anda sukai. Misalnya anda menggunakan pico, gunakan perintah seperti ini untuk membuat skrip shell yang bernama hello:
$ pico hello
Setelah itu anda buatlah isi dari file hello tersebut, misalnya:
echo hello world
Kemudian simpanlah file tersebut dan keluar dari editor teks yang anda gunakan. Untuk membuat skrip shell hello tersebut dapat dijalankan, gunakan perintah:
$ chmod +x hello
Perintah tersebut akan membuat file hello menjadi dapat dieksekusi. Anda dapat menjalankannya dengan perintah seperti:
$ ./hello
Jika berhasil, anda akan mendapatkan output:
hello world
Pipe dan Redireksi
Banyak perintah di Linux yang sangat sederhana, biasanya mendapatkan inputnya dari standard input atau parameter dan mengeluarkan outputnya ke standard output. Perintah-perintah ini tidak berguna jika digunakan sendirian. Namun beberapa dari perintah-perintah tersebut dapat dirangkaikan untuk mengerjakan tugas yang spesifik.
Beberapa contoh perintah-perintah tersebut adalah:
• cat: membaca isi parameter-parameternya, kemudian mengeluarkannya ke standard output. Contoh: cat /etc/passwd akan menampilkan isi dari file /etc/passwd
• wc: membaca standard input kemudian memberikan output jumlah karakter, kata dan baris pada standard output.
• find: mencari file yang sesuai kriteria pada parameternya, kemudian memberikan outputnya ke standard output. Contoh: find -type d akan menampilkan daftar direktori di bawah direktori kerja.
• sed: membaca standard input, mengeditnya sesuai dengan perintah pada parameternya, kemudian memberikan outputnya ke standard output. Contoh: sed -e s/lama/baru/g akan mengganti semua kata lama pada standard input menjadi baru
• grep: membaca standard input, kemudian menampilkan baris yang berisi string pada parameter grep. Contoh: grep root akan menampilkan baris pada standard input yang berisi kata root.
Perintah-perintah tersebut dapat kita rangkaikan untuk memproses data, sebagai contoh:
• cat /etc/passwd | grep rina, akan menampilkan baris-baris yang berisi string 'rina' dari file /etc/passwd
• find | grep -i mp3, akan menampilkan seluruh file MP3 pada direktori kerja dan direktori di bawahnya
• find /usr/src/linux/ | grep "\.[chS]$" | wc, menampilkan jumlah file yang berakhiran c, h dan S pada kode source Linux.
• find /usr/src/linux/ | grep "\.[chS]$" | xargs cat | wc, menampilkan jumlah karakter, kata dan baris pada seluruh file yang herakhiran c, h dan S pada kode source Linux.
Perintah-perintah di atas akan menampilkan outputnya pada terminal, anda pun dapat menampilkan output pada sebuah file, sebagai contoh:
• find /var/mp3/ | grep -i mp3 > semua.m3u, akan membuat file playlist MP3 semua.m3u yang berisi seluruh file MP3 di direktori /var/mp3/
• cat source.c | sed s/execv/execvp/g > source_baru.c, mengganti seluruh string execv menjadi execvp pada file source.c, kemudian mengoutputkannya ke file source_baru.c
Anda pun dapat mendapatkan input dari file, jadi beberapa perintah di atas dapat kita sederhanakan menjadi:
• grep rina < /etc/passwd, hasilnya sama dengan cat /etc/passwd | grep rina
• sed s/execv/execvp/g < source.c > source_baru.c, hasilnya sama dengan cat source.c | sed s/execv/execvp/g > source_baru.c
Dapat kita lihat, dari perintah-perintah yang kelihatannya tidak berguna itu, dapat dirangkai menjadi banyak sekali kombinasi untuk mengerjakan tugas-tugas yang beraneka ragam. Dokumentasi lengkap dari masing-masing program tersebut tersedia pada halaman man atau info program yang bersangkutan. Pipe dan redireksi akan sangat berguna jika kita akan membuat skrip shell yang akan mengotomatisasi pekerjaan kita sehari-hari.
Substitusi Perintah
Anda dapat melakukan substitusi suatu perintah dengan outputnya pada bash. Perintah yang berada di antara tanda kutip terbalik (`) akan digantikan dengan output dari perintah tersebut.
Sebagai contoh:
• cat `find -type f | grep "\.h$"` | wc, pada perintah ini, bagian find -type f | grep "\.h$" akan digantikan dengan output dari perintah tersebut, yaitu daftar file yang berakhiran h pada direktori kerja dan direktori di bawahnya. Jadi misalnya perintah tersebut menemukan file-file stdio.h, unistd.h dan stdlib.h, maka perintah tersebut akan menjadi cat stdio.h unistd.h stdlib.h | wc, yang akan menampilkan jumlah karakter, kata dan baris pada ketiga file header tersebut.
• cp `find -type f | grep -i mp3` /var/mp3, perintah find -type f | grep -i mp3 disini akan mencari file MP3 pada direktori kerja dan direktori di bawahnya, sehingga perintah tersebut akan men-copy seluruh file MP3 pada direktori kerja dan direktori di bawahnya ke direktori /var/mp3.
Namun anda harus hati-hati, pada kedua perintah di atas jika output dari perintah yang akan disubstitusi tersebut terlalu banyak, maka kemungkinan akan terjadi pesan kesalahan. Sebabnya adalah ada jumlah parameter maksimum yang dapat diberikan pada satu program (dalam hal ini adalah cat dan cp). Untuk mengatasi hal tersebut anda dapat menggunakan xargs atau konstruksi for di bawah.
Dengan xargs, perintah pertama di atas dapat diganti menjadi:
• find -type f | grep "\.h$" | xargs cat | wc, pada perintah ini xargs akan menjalankan perintah cat untuk masing-masing file pada standard input-nya.
Perintah kedua hanya dapat dilakukan dengan konstruksi for.
Konstruksi 'for'
Bash memiliki konstruksi for, dengan sintaks seperti:
for A in linus richard eric
do
echo $A
done
Perintah di atas akan memberikan output seperti ini:
linus
richard
eric
Secara umum konstruksi for akan mengeksekusi barisan perintah di antara do dan done secara berulang-ulang untuk setiap parameter (dalam hal ini adalah linus, richard dan eric), pada perintah di atas, parameter akan disimpan di variabel $A.
Jadi konstruksi di atas akan mengeksekusi perintah-perintah seperti ini:
echo linus
echo richard
echo eric
Beberapa perintah di bash dapat disatukan dalam satu baris perintah dengan menggunakan titik koma (;), jadi perintah di atas dapat disatukan dalam satu baris menjadi: for A in linus richard eric ; do echo $A ; done
Beberapa contoh konstruksi for:
• for A in `find -type f | grep -i mp3` ; do cp $A /var/mp3 ; done, perintah ini memiliki efek yang sama seperti contoh kedua pada substitusi perintah di atas, namun tidak ada batasan pada jumlah file yang ditemukan.
• for A in `cat semua.m3u` ; do mpg123 $A ; done, perintah ini akan memainkan file MP3 yang terdapat di dalam playlist semua.m3u dengan menggunakan player mpg123.
• for A in `find /etc/ -type f` ; do sed -e "s/10\.0\.0\.1/192.168.0.1/g" < $A > /tmp/file.tmp ; cp -f /tmp/file.tmp $A ; done, perintah ini akan mengganti string "10.0.0.1" ke "192.168.0.1" pada seluruh file di dalam direktori /etc/.
• cd /home/ ; for A in * ; do (cd /var/backup ; tar cfzp $A.tar.gz /home/$A; chown $A $A.tar.gz) ; done, perintah ini akan membuat file backup dari setiap home directory pada /home, dan mengganti kepemilikan file backup tersebut menjadi milik user yang bersangkutan. Perintah pada dalam kurung di atas akan dieksekusi di dalam sub shell, gunanya supaya environment (direktori kerja, variabel environment dan sebagainya) tetap sama untuk setiap perintah yang dieksekusi oleh for.