Skrip shell menyediakan fitur yang sangat kuat:kemampuan untuk mengarahkan output dari perintah dan skrip dan mengirimkannya ke file, perangkat, atau bahkan sebagai input ke perintah atau skrip lain.
Artikel ini berfokus pada keluaran perintah dan skrip.
Jenis keluaran
Perintah dan skrip dalam shell dapat menghasilkan dua tipe dasar keluaran:
- STDOUT: Output normal dari perintah/skrip (deskriptor file 1)
- STDERR: Keluaran kesalahan dari perintah/skrip (deskriptor file 2)
Secara default, STDOUT dan STDERR dikirim ke layar terminal Anda.
Dalam hal masukan, STDIN secara default membaca input dari keyboard (deskriptor file 0). Deskriptor file adalah pengidentifikasi unik untuk file atau sumber daya I/O lainnya.
Cara mengarahkan ulang keluaran shell
Ada beberapa cara untuk mengarahkan output dari skrip dan perintah shell.
1. Alihkan STDOUT
Untuk contoh berikut, saya akan menggunakan kumpulan file sederhana ini:
$ls -la file*
-rw-r--r--. 1 admin2 admin2 7 Mar 27 15:34 file1.txt
-rw-r--r--. 1 admin2 admin2 10 Mar 27 15:34 file2.txt
-rw-r--r--. 1 admin2 admin2 13 Mar 27 15:34 file3.txt
Saya menjalankan ls
simple sederhana perintah untuk mengilustrasikan STDOUT vs. STDERR, tetapi prinsip yang sama berlaku untuk sebagian besar perintah yang Anda jalankan dari shell.
Saya dapat mengarahkan output standar ke file menggunakan ls file* > my_stdout.txt
:
$ls file* > my_stdout.txt
$ cat my_stdout.txt
file1.txt
file2.txt
file3.txt
Selanjutnya, saya menjalankan perintah serupa, tetapi dengan 1
sebelum >
. Mengarahkan ulang menggunakan >
sinyalnya sama dengan menggunakan 1>
untuk melakukannya:Saya memberi tahu Shell untuk mengarahkan STDOUT ke file itu. Jika saya menghilangkan deskriptor file, STDOUT digunakan secara default. Saya dapat membuktikan ini dengan menjalankan sdiff
perintah untuk menampilkan output dari kedua perintah secara berdampingan:
$ls file* 1> my_other_stdout.txt
$sdiff my_stdout.txt my_other_stdout.txt
file1.txt file1.txt
file2.txt file2.txt
file3.txt file3.txt
Seperti yang Anda lihat, kedua keluaran memiliki konten yang sama.
2. Alihkan STDERR
Sekarang, apa yang spesial dari STDERR? Untuk mendemonstrasikannya, saya akan memperkenalkan kondisi kesalahan pada contoh sebelumnya dengan ls file* non-existing-file* > my_normal_output.txt
:
Ini hasilnya:
Gambar
Berikut beberapa pengamatan dari pengujian di atas:
- Output tentang file yang ada dikirim dengan benar ke file tujuan.
- Kesalahan (yang ditampilkan saat saya mencoba membuat daftar sesuatu yang tidak ada) dikirim ke layar. Ini adalah kesalahan tempat default yang dikirim kecuali Anda mengalihkannya.
[ Unduh Lembar Cheat Skrip Bash Shell. ]
Selanjutnya, saya akan mengarahkan output error dengan merujuk deskriptor file 2 secara eksplisit dengan ls file* non-existing-file* > my_normal_output.txt 2> my_error_output.txt:

Pada contoh di atas:
ls
perintah tidak menampilkan pesan kesalahan di layar seperti sebelumnya.- Keluaran normal berisi apa yang saya harapkan.
- Pesan kesalahan dikirim ke
my_error_output.txt
berkas.
3. Kirim STDOUT dan STDERR ke file yang sama
Situasi umum lainnya adalah mengirim STDOUT dan STDERR ke sama berkas:
$ls file* non-existing-file* > my_consolidated_output.txt 2>&1
$ cat my_consolidated_output.txt
ls: cannot access 'non-existing-file*': No such file or directory
file1.txt
file2.txt
file3.txt
Dalam contoh ini, semua output (normal dan error) dikirim ke file yang sama.
2>&1
konstruksi berarti "kirim STDERR ke tempat yang sama dengan saat Anda mengirim STDOUT ."
4. Arahkan ulang output, tetapi tambahkan file
Dalam semua contoh sebelumnya, setiap kali saya mengarahkan beberapa keluaran, saya menggunakan satu >
, yang berarti "kirim sesuatu ke file ini, dan mulai file dari awal ." Akibatnya, jika file tujuan ada, file tersebut akan ditimpa.
Jika saya ingin menambahkan ke file yang ada, saya perlu menggunakan >>
. Jika file tersebut belum ada, maka akan dibuat:
$echo "Adding stuff to the end of a file" >> my_output.txt
$cat my_output.txt
file1.txt
file2.txt
file3.txt
Adding stuff to the end of a file
5. Redirect ke proses lain atau ke mana pun
Contoh di atas mencakup pengalihan output ke file, tetapi Anda juga dapat mengarahkan output ke proses lain atau dev/null
.
Mengirim output ke proses lain adalah salah satu fitur shell yang paling kuat. Untuk tugas ini, gunakan |
(pipa), yang mengirimkan output dari satu perintah ke input dari perintah berikutnya:
ps -ef | grep chrome | grep -v grep | wc -l
21
Contoh di atas mencantumkan proses saya, memfilter semua yang berisi string chrome , mengabaikan baris tentang grep
my saya perintah, dan menghitung baris yang dihasilkan. Jika saya ingin mengirim output ke file, saya menambahkan >
dan nama file di akhir rantai.
Terakhir, berikut adalah contoh di mana saya ingin mengabaikan salah satu output, STDERR:
$tar cvf my_files.tar file* more-non-existing*
file1.txt
file2.txt
file3.txt
tar: more-non-existing*: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Karena tar
perintah tidak menemukan file apa pun dengan nama yang dimulai dengan more-non-existing
, beberapa pesan kesalahan ditampilkan di akhir.
Misalkan saya membuat beberapa skrip dan tidak peduli melihat atau menangkap kesalahan ini (saya tahu, dalam kehidupan nyata, Anda harus mencegah dan menangani kesalahan, bukan mengabaikannya):
$tar cvf my_files.tar file* more-non-existing* 2> /dev/null
file1.txt
file2.txt
file3.txt
/dev/null
adalah file perangkat khusus yang seperti "lubang hitam":Apa yang Anda kirim ke sana menghilang begitu saja.
[ Unduh panduan ini untuk memasang aplikasi di Linux. ]
6. Gunakan pengalihan dalam skrip
Gambar
=== SUMMARY OF INVESTIGATION OF chrome ===
Date/Time of the execution: 2022-03-25 18:05:50
Number of processes found.: 5
PIDs:
1245475
1249558
1316941
1382460
1384452
Skrip yang sangat sederhana ini melakukan hal berikut:
- Baris 3:Menjalankan perintah di sistem operasi dan menyimpan ke variabel DATE_TIME.
- Baris 6:Menjalankan
ps
perintah dan redirect kegrep
dan ke sebuah file.- Daripada mengirim output ke file, saya bisa mengirimnya ke variabel (seperti pada baris 3), tetapi dalam kasus ini, saya ingin menjalankan tindakan lain menggunakan output yang sama, jadi saya merekamnya. Dalam situasi yang lebih realistis, memiliki file juga dapat berguna selama pengembangan atau pemecahan masalah, jadi saya dapat lebih mudah menyelidiki apa yang dihasilkan oleh perintah.
- Baris 8:Menjalankan perintah tambahan, mengarahkan output ke
wc
, dan menetapkan hasilnya ke variabel. - Baris 9:Menggunakan
awk
untuk memilih hanya kolom 2 dari output dan mengurutkannya dalam urutan menurun (hanya untuk menambahkan pipa lain).
Menutup
Itu tadi beberapa contoh redirect STDOUT dan STDERR. Menyatukan semua ini, Anda menyadari betapa kuatnya pengalihan. Dengan merantai perintah individu, memanipulasi outputnya, dan menggunakan hasilnya sebagai input untuk perintah berikutnya, Anda dapat melakukan tugas yang sebaliknya mengharuskan Anda mengembangkan skrip atau program. Anda juga dapat menggabungkan teknik ini ke dalam skrip lain, menggunakan semuanya sebagai blok penyusun.