RSS

Bash One Liner 101

11 Jun

One liner artinya kalimat yang hanya terdiri dari satu baris. Adapun bash one liner adalah perintah bash yang hanya terdiri dari satu baris. Meskipun singkat, perintah ini mempunyai sederet manfaat. Simak uraiannya berikut ini.
oleh Mulyadi S.

Saya yakin mayoritas pengguna PC ingin sesuatu yang praktis. Misalnya saat bermain game, kenapa harus repot menembaki monster musuh satu persatu dengan pistol jika dapat memakai rudal? Atau saat kita mengetik di Open Office, kenapa harus mengetik 100 surat yang sama dengan 100 nama penerima yang berbeda jika ada fasilitas mail merge? Sekali ketik, masukkan 100 nama, otomatis surat akan diduplikasi 100 kali. Contoh lainnya, kenapa harus mengarahkan mouse ke sudut kiri atas jika tombol [Alt]+[F1] juga dapat me­nam­pilkan menu di GNOME?

Tidak ketinggalan juga untuk perintah di command line. Banyak pekerjaan bisa diselesaikan dengan cepat melalui suatu perintah relatif pendek. Tidak percaya? Akan kita buktikan di artikel ini. Syaratnya, distribusi Linux Anda menyediakan shell Bash. Anda disarankan memakai Bash versi 3 ke atas. Cara termudah mengecek versi Bash adalah:
$ echo $SHELL
/bin/bash

$ /bin/bash –version
GNU bash, version 3.2.33(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
Ini berarti versi Bash-nya adalah 3.2.33.

Membuat file backup
Dalam praktik manajemen file yang baik, disarankan untuk membuat backup sebelum mengedit isinya. Backup berkala diperlukan agar kita memiliki copy data di media lain. Khusus untuk satu file, mungkin perintah backup-nya adalah:
$ mv penting.txt penting.txt.bak

Perintah di atas mungkin tidak sukar untuk diketik karena nama filenya pendek. Namun, jika perintahnya:
$ mv rekap_penghasilan_bulan_juni_tahun_2010.txt
rekap_penghasilan_bulan_juni_tahun_2010.txt.bak

Anda tentu enggan mengetiknya. Memang kita bisa mengandalkan auto completion di Bash dengan menekan [Tab], tetapi itu artinya tetap ada ketikan ekstra dan baris perintah tetap panjang. Oleh karena itu, cara yang lebih praktis dapat dilakukan seperti berikut ini.
$ mv rekap_penghasilan_bulan_juni_tahun_2010.txt{,.bak}

Perintah di atas menggunakan salah satu bentuk expansion, yaitu pemberian akhiran nama file. Contoh sederhana expansion dapat dilihat pada contoh berikut ini.
$ mv {a,b}.txt
sama dengan
$ mv a.txt b.txt
Cara yang sama dapat digunakan untuk backup, hanya saja bukan untuk awalan nama file, tetapi akhirannya.

Menjalankan ulang suatu perintah sebagai root
Sering kali kita menjalankan suatu perintah dan baru sadar kita memerlukan privilege root, misalnya:
$ ls -l
total 0
-rw-r–r– 1 root root 0 2010-09-12 10:24 a.txt
-rw-r–r– 1 root root 0 2010-09-12 10:23 b.txt

$ echo a > a.txt
bash: a.txt: Permission denied

Ternyata ada sesuatu yang salah! Jika diperhatikan, kita tidak memiliki hak tulis ke file a.txt. Pada kondisi ini biasanya kita gunakan perintah su dan mengulang pe­rintah di atas:
$ su
# echo a > a.txt
# exit
$
Kini, kita coba cara lainnya:
$ echo a > a.txt
bash: a.txt: Permission denied
$ sudo !!
sudo echo a > a.txt
bash: a.txt: Permission denied

Bekerja pada dua direktori Apabila Mengutip perintah di dalam tanda () mencegah kita keluar dari direktori saat ini.Bekerja pada dua direktori Apabila Mengutip perintah di dalam tanda () mencegah kita keluar dari direktori saat ini.

Apa maksud perintah di atas? Kenapa gagal? Karakter “!!” menyatakan kita akan meng-copy seluruh perintah ter­akhir yang kita ketik. Dengan tambahan sudo, artinya kita mengulang perintah sebelumnya sebagai root. Sederhana kan?
Kenapa masih gagal? Karena kita menggunakan tanda “>”. Masalahnya di sini bukan pada tanda “>” sebagai redirection, tetapi bagaimana perintah sudo mengartikan perintah “echo a > a.txt”. Apabila Anda langsung mengawalinya dengan sudo, perintah lengkapnya bisa berarti:

Tampilkan karakter “a” ke layar sebagai root, lalu tulis ke file a.txt

Membingungkan? Perhatikan bahwa yang dilakukan sebagai root hanya bagian yang menampilkan karakter “a”, namun saat menulis ke file dikerjakan sebagai user biasa. Inilah yang menyebabkan penulisan diblokir. Lalu bagaimana seharusnya?
$ sudo sh -c “!!”
sudo sh -c “echo a > a.txt”
$ cat a.txt
a

Kali ini sukses! Alasannya karena keseluruhan perintah sampai dengan redirection dikerjakan sebagai root, ini berkat bantuan perintah sh -c untuk menjalankan suatu shell dan perintah tertentu.

Pindah direktori, kerjakan sesuatu, kembali ke direktori asal.
Misalnya Anda diminta mengerjakan suatu urutan sederhana: mencari tahu ukuran direktori /usr/share/doc beserta isinya, lalu tampilan semua direktori dengan nama depan “a” dan tampilkan semua file di dalamnya dengan nama depan “readme”. Urutannya akan menjadi:
$ du -sh /usr/share/doc
$ ls -ld /usr/share/doc/a*
$ find /usr/share/doc -type f -iname “readme*”

Pekerjaan bisa selesai, tetapi ada satu hal yang kurang efisien. Bisa Anda tebak? Kita berulang kali menyebutkan nama direktori /usr/share/doc. Ini bisa dipangkas jika sebelumnya kita pindah dulu ke direktori tersebut:
$ cd /usr/share/doc

Perintahnya menjadi:
$ du -sh
$ ls -ld a*
$ find -type f -iname “readme*”
Masalahnya di sini adalah kita “dipaksa” berpindah ke direktori lain, sementara sangat mungkin kita harus kembali ke direktori sebelumnya, misalnya home direktori kita. Tentunya kita harus tambahkan perintah seperti ini:
$ cd ~
Sedikit bertele-tele? Bagaimana jika kita ringkas menjadi:
$ ( cd /usr/share/doc/ ; du -sh ; ls -ld a* ; find -type f
-iname “readme*” )

Begitu perintah di atas selesai dijalankan, kita otomatis akan kembali pada direktori awal kita. Ini bisa terjadi karena kita mengutip perintah di dalam tanda ( ). Tanda ini adalah penanda bahwa kita akan membuat sub shell. Sederhananya, kita membuat suatu shell baru, jadi terpisah dengan shell kita saat ini. Dengan demikian, mudah dijelaskan kenapa perpindahan direktori tidak berpengaruh. Satu shell dengan shell lain memiliki “ruang” yang terpisah.

Hapus isi file secara cepat
Pemakai Linux tingkat menengah biasanya sudah akrab dengan redirection untuk menambah isi file. Namun, sering yang merepotkan adalah bagaimana menghapus sebagian isi file? Secara spontan biasanya seseorang akan menjalankan text editor (misalnya Vim) dan meng­hapus baris terkait. Adakah cara yang lebih cepat? Utility sed mungkin bisa.  Misal­nya Anda punya file a.txt berisi:
$ cat a.txt
a
b
c
d
e
Apabila Anda ingin menghapus baris kedua, ketik perintah berikut ini.
$ sed -i 2d a.txt
Hasilnya:
$ cat a.txt
a
c
d
e
Untuk menghapus lebih dari satu baris, misalnya menghapus baris pertama hingga ketiga, ketik perintah:
$ sed -i 1,3d a.txt
Hasilnya:
$ cat a.txt
d
e

Mengganti spasi dengan undercore idak usah repot mengubah kumpul­an huruf di command line. Bash bisa melakukannya untuk Anda.

Ganti tanda spasi pada nama file dengan karakter lain
Apabila ada pertanyaan, apa perbedaan antara Windows dan Linux dalam mena­ngani nama file? Anda mungkin menjawab, tidak ada bedanya. Memang benar, terutama jika Anda hanya berfokus pada panjang nama file. Namun, bagaimana jika Anda punya suatu file bernama “ini nama file dengan banyak spasi .txt”
Jika Anda ingin menampilkan isinya:
$ cat ini nama file dengan banyak spasi .txt
Hasilnya adalah:
cat: ini: No such file or directory
cat: nama: No such file or directory
cat: file: No such file or directory
cat: dengan: No such file or directory
cat: banyak: No such file or directory
cat: spasi: No such file or directory
cat: .txt: No such file or directory

Mengahapus satu baris secara instan Sed dapat menghapus satu baris di file lebih cepat dari editor teks.Mengahapus satu baris secara instan Sed dapat menghapus satu baris di file lebih cepat dari editor teks.

Kenapa demikian? Masalahnya ada pada penggunaan spasi. Linux secara default menganggap spasi sebagai separator, artinya pemisah misalnya antara perintah dan option, perintah dengan argumen nama file tujuan, dan seterusnya. Jadi, bukan bagian dari nama file itu sendiri.

Buat Anda yang sering bekerja dengan file semacam ini, Anda punya dua pilihan, yaitu melakukan quoting, maksudnya adalah mengutip nama file di dalam tanda petik tunggal atau ganda.
Contohnya:
$ cat ‘ini nama file dengan banyak spasi .txt’
atau bisa juga dengan memanfaatkan escaping:
$ cat ini\ nama\ file\ dengan\ banyak\ spasi\ .txt

Dua ini cara ini bisa relatif mudah dilakukan dengan bantuan tombol [Tab]. Cukup tekan [Tab] sekali, fungsi auto completion akan bekerja.

-> Mengubah namanya dengan membuang spasi menjadi suatu karakter lain, biasanya garis bawah. Jadi kita lakukan seperti ini:
$ mv ini\ nama\ file\ dengan\ banyak\ spasi\ .txt ini_
nama_file_dengan_banyak_spasi_.txt
Jika perintah ini dirasa panjang, ada cara lebih singkat:
mv  ‘ini nama file dengan banyak spasi .txt’ !#:$:gs/ /_/
Parameter kedua adalah variasi lain event designator. Jika kita telusuri, maknanya:

->!# : tampilkan ulang semua kata-kata yang telah diketik sejauh. Jadi, jika dite­rapkan pada perintah:
$ echo aa !#
Ini sama saja dengan mengetikkan:
$ echo aa echo aa
huruf yang di-bold adalah substitusi dari !#

-> !#:$ : ambil kata terakhir dari string yang telah diketik sejauh ini. Artinya jika kita lakukan:
$ echo aa !#:$
sama saja dengan mengetik:
$ echo aa aa

-> !#:$:gs/ /_/ : Pada tahap ini, dilakukan penggantian karakter. Operator “s” berarti ganti semua tanda spasi dengan garis bawah (_). Lalu “g” berarti penggantian dilakukan untuk semua karakter yang sesuai (dalam hal ini spasi), bukan hanya karakter pertama yang cocok.

Start editor Vi dan langsung menuju baris tertentu

Tips ini ada hubungannya dengan tips sebelumnya, yaitu menghapus baris tertentu. Simak ilustrasinya berikut ini.
Anda mengelola sebuah web server pribadi. Pada suatu saat, Anda terpikir untuk mengubah suatu setting program Apache (salah satu program web server). Saat ini, Anda cuma ingat sekilas dari beberapa tutorial di Internet bahwa parameter yang Anda butuhkan memiliki kata “Document”. Namun, Anda tidak ingat per­sis namanya. Untuk itu, Anda kemudian mengggunakan perintah grep seperti berikut ini.

Koreksi perintah Bash memiliki     beberapa pilihan agar Anda cepat mengoreksi ke­salahan perintah.

$ grep -n -i document /etc/httpd/conf/httpd.conf | grep -v \#
280:DocumentRoot “/var/www/html”

Opsi -n pada grep memberitahukan pada kita nomor baris di mana kata yang kita cari ditemukan. Karena baris komentar tidak dibutuhkan, kita pangkas dengan perintah grep berikutnya (menggunakan opsi -v). Kesimpulannya, pada baris 280 ada parameter DocumentRoot. Karena ini yang Anda cari, buka text editor, scroll ke bawah beberapa kali. Alternatifnya, pada vi, gunakan perintah “280G”. Agar langkahnya lebih efisien, kita dapat mempersingkatnya menjadi:
$ vi +280 /etc/httpd/conf/httpd.conf

Perintah di atas meminta vi langsung menuju baris 280 begitu membuka file httpd.conf. Untungnya, proses ini bisa diper­singkat menjadi:
$ vi +/Document /etc/httpd/conf/httpd.conf

Kali ini vi diminta untuk mencari baris pertama yang mengandung kata “Document” dan langsung berpindah ke baris tersebut. Mungkin tidak optimal karena bisa terjadi salah tebak, namun menghemat waktu bila Anda tahu persis nama parameternya. Jadi, silahkan Anda pilih.

Menggunakan operator logika

Backup sembari memberi akhiran nama Backup umumnya dilakukan dengan memberi akhiran nama tertentu. Dengan expansion, Anda pun bisa "memotong kompas" dan menghemat ketikan.Backup sembari memberi akhiran nama Backup umumnya dilakukan dengan memberi akhiran nama tertentu. Dengan expansion, Anda pun bisa “memotong kompas” dan menghemat ketikan.
Sudo last command Kelupaan menjalankan perintah sebagai root adalah kelalaian yang sering terjadi di Linux. Untuk itu, gunakan trik “!!” dan sudo untuk mengoreksinya.Sudo last command Kelupaan menjalankan perintah sebagai root adalah kelalaian yang sering terjadi di Linux. Untuk itu, gunakan trik “!!” dan sudo untuk mengoreksinya.

Biasanya jika sudah sudah berhadapan dengan yang istilah “operator”, pengguna PC sudah membayangkan suatu rumus matematika yang rumit dan biasanya dikerjakan oleh ilmuwan. Tapi sebenar­nya operator ini juga banyak gunanya dalam penggunaan PC sehari-hari.

Bash memiliki operator “&&” atau disebut juga logical AND. Maksudnya adalah mengevaluasi dua kondisi dan menghasilkan true atau benar hanya jika kedua kondisi benar. Anda pasti merasa ruwet dengan pernyataan ala matematis tadi. Jadi bagaimana contoh nyatanya?
$ touch true.txt
$ ls
true.txt
$ rm true.txt && echo “done..”
done..

Membuat dan menghapusnya lagi, cukup mudah dipahami. Adapun tanda “&&” disertai perintah echo memiliki makna:
Jika perintah di sebelah kiri && (rm) sukses dilaksanakan, lakukan perintah di sebelah kanan echo. Namun, jika perintah di sebelah kiri gagal, maka tidak perlu dikerjakan perintah selanjutnya.

Ini sesuai sifat operator AND, dimana jika salah satu kondisi operand sudah true, maka perlu dicek kondisi operand lainnya. Apabila false, sudah tidak perlu. Kenapa? Karena sudah pasti hasil akhirnya false. Prinsipnya, false AND true = false, sedangkan false AND false = false.

Teknik ini berguna untuk “menyambung” perintah secara berurutan sehingga Anda yakin seluruhnya selesai hanya jika perintah yang mendahului sukses. Misalnya, Anda punya program dengan source code di dalam paket abc.tar.gz. Maka setelah Anda ekstrak:
$ tar xzvf abc.tar.gz
dan pindah ke direktori di dalamnya:
$ cd abc

Dengan demikian, urutan perintah berikut akan meng-compile dan install (dengan asumsi sudo tidak menanyakan password)
$ ./configure && make && make install

Jika Anda sering meng-compile ulang kernel, Anda tentunya mengerti bahwa secara garis besar compilation meliputi compile image kernel utama dan modul-modulnya. Dengan kata lain, jika image utama gagal di-compile, logikanya percuma juga mencoba meng-compile modulnya. Perintah berikut akan melak­sanakan logika tersebut:
$ make bzImage && make modules
Koreksi kesalahan sederhana shell
Apabila Anda sedang terburu-buru dan terlanjur mengetik perintah:
$ rn ~/mydoc.txt

Perintahnya salah karena perintah rn memang tidak dikenal. Lalu apa yang Anda lakukan? Bisa bermacam-macam. Secara refleks umumnya adalah menekan panah atas, diikuti tombol [Home]. Majukan kursor, hapus beberapa karakter, dan ketik ulang menjadi:
$ rm ~/mydoc.txt
Agar lebih efisien, ketik perintah:
$ ^rn^rm
rm ~/mydoc.txt
Apabila perintah yang dikoreksi panjang, Anda pun dapat menggunakan perintah:
$ rm !$
Variasi pertama melakukan penggantian pada kata rn menjadi rm (hanya satu kali), sedangkan variasi kedua memanggil perintah rm dengan parameter yang mengikuti perintah sebelumnya.

Kesimpulan
Suatu perintah singkat bisa menjadi sangat berguna jika Anda tahu kapan dan bagaimana menggunakannya. Ulasan ini hanyalah sebagian dari apa yang bisa Anda lakukan di bash. Pada shell lain, tentunya berbeda lagi kemampuannya. Selamat mencoba!

Iklan
 
Tinggalkan komentar

Ditulis oleh pada 11 Juni 2011 in Tips and Trick

 

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

 
%d blogger menyukai ini: