Linux Redirection : 2>&1

Redirection dalam sistem unix dan Linux merupakan salah satu cara untuk melewatkan output dari suatu program ke program lain, dengan redirection kita bisa menyimpan output suatu file baik kedalam sebuah file atau diproses dengan program lain.

Ada 3 redirection yang sering dijumpai dalam perintah linux.

  1. Standar input (stdin)
  2. Standar output (stdout)
  3. Standar error (stderr)
  4. Pipe

Seperti halnya filosofi *nix, yaitu “Everything is file”, semuanya adalah file begitu juga dengan 3 standar output,input dan error diatas, yang didefinisikan dengan angka(deskriptor file), stdin adalah 0, stdout = 1, dan stderr dengan angka 2. Semua angka ini didefinisikan pada file /usr/include/unistd.h

$grep -n STDIN -2 /usr/include/unistd.h 181- 182-/* Standard file descriptors. */ 183:#define STDIN_FILENO 0 /* Standard input. */ 184-#define STDOUT_FILENO 1 /* Standard output. */ 185-#define STDERR_FILENO 2 /* Standard error output. */

Standar Input (stdin)

Hampir semua program menerima input dari pemakainya, baik dari keyboard atau device input lainnya. Secara default stdin adalah keyboard. Disini penggunaan stdin bisa dengan tanda ‘<’.

Contoh:
$cat < its.file line 1 line 2
pada perintah diatas ‘cat’ menerima input ‘its.file’ dan kemudian menampilkannya di stdout.

Standar Output (stdout)

Begitu juga dengan stdout, kebanyakan program di Linux juga memprint outputnya di stdout. Misalkan program_ ls_, program ini akan menampilkan isi direktori aktif kemudian mencetaknya di stdout.

Contoh:
$ls > listdirektori.txt
dari perintah diatas maka semua output dari ls akan disimpan ke dalam file_‘listdirektori.txt’, perintah ini (>) membuat file baru bernama ‘listdirektori.txt’ jika file tersebut telah ada maka isi file tersebut akan diganti dengan output dari_ls.
Agar file yang telah ada tidak diganti/ditimpa dengan yang baru gunakan 2 tanda ‘>’
$ls >> listdirektori.txt
Isi file ‘listdirektori.txt’ akan ditambahkan dengan output ls.

Perintah ini juga bisa digunakan untuk copi file ke file lain.
$cat file1 > file2

Selain output pada file kita juga bisa melakukan redirect pada device.
$cat musik.wav > /dev/audio
Seperti memainkan file musik lewat pemutar mp3 kita, kita akan mendengarkan suara ketika melakukan perintah ini. Karena /dev/audio adalah file deskriptor dari speaker yang kita punya.

Pipe

Dari 2 hal diatas kita telah lihat bagaimana melakukan redirection input  ke dalam suatu program dan redirection output suatu program ke dalam sebuah file. Dengan pipe kita bisa melakukan redirection output suatu program menjadi input bagi program lain.

Contoh:
$cat 'file.txt' | grep 'linux'
Perintah ini berarti kita mencari kata ‘linux‘ di dalam file ‘file.txt‘, meski sebenarnya bisa dengan perintah grep ‘linux’ ‘file.txt’ namun pipe akan sangat berguna untuk melakukan proses secara berulang terhadap output tersebut, seperti contoh berikut:

$cat 'file.txt' | grep 'linux' | tr a-z A-Z
Yaitu menampilkan file ‘file.txt’, kemudian hanya menampilkan kata ‘linux’ kemudian mengubahnya menjadi huruf besar semua (tr a-z A-z).

Ketika melakukan perintah pada Linux, sering kita menemui error, dan kemudian error ini akan ditampilkan lewat stderr.
$cat 'not_exist_file' cat: not_exist_file: No such file or directory
Output dari perintah diatas ditampilkan di screen (terminal) lewat stderr, untuk menghindari error ini bisa dilakukan dengan cara berikut.


$cat not_exist_file 2> /dev/null
tanda 2 diatas berarti semua output dari stderr akan diteruskan ke /dev/null, dan tidak akan menampilkan apapun, jika file not_exist_file benar-benar tidak ada.
Mungkin tidak begitu terlihat perbedaannya tapi coba jalankan 2 perintah berikut, agar lebih memahami
$find / -name *.txt $find / -name *.txt 2>/dev/null
perintah pertama pasti akan mengeluarkan banyak output karena error yang didapat perintah find ketika mengakses file/direktori, sedangkan perintah kedua semua output error (dari stderr , angka 2) akan dilewatkan ke /dev/null.

Penggunaan redirection diatas juga bisa digabung dengan redirection lainnya.

Bagaimana dengan judul dari posting diatas 2>&1, kalimat ini dalam suatu perintah di Linux berarti melewatkan setiap output dari stderr ke stdin, jadi setiap error yang dikeluarkan akan diteruskan menuju standar output. tanda**>** sendiri adalah redirection pada suatu file tapi karena tanda & maka output tersebut diteruskan lagi ke stdout / 1. Jika tanda & tidak ada maka outputnya adalah sebuah file dengan nama 1.

Referensi:
+ [http://linuxhelp.blogspot.com](http://linuxhelp.blogspot.com/2006/01 /inputoutput-redirection-made-simple-in.html)