Di posting sebelumnya, kami berbicara tentang parameter dan opsi secara rinci. Hari ini, kita akan berbicara tentang sesuatu yang penting dalam skrip shell, yaitu Input, Output, dan Redirection.
Anda dapat menampilkan output dari skrip shell dengan dua cara:
- Menampilkan keluaran di layar.
- Kirim keluaran ke file.
Descriptor file standar
Semuanya adalah file di Linux, dan itu termasuk input dan output.
Setiap proses dapat membuka sembilan deskriptor file secara bersamaan. Deskriptor file 0, 1, 2 disimpan untuk penggunaan bash shell.
0 STDIN.
1 STDOUT.
2 STDERR.
Anda dapat menggunakan deskriptor file di atas untuk mengontrol input dan output.
Anda harus sepenuhnya memahami ketiganya karena mereka seperti tulang punggung skrip shell Anda. Jadi kami akan menjelaskan semuanya secara detail.
STDIN
STDIN adalah singkatan dari input standar, yang merupakan keyboard secara default.
Anda dapat mengganti STDIN, yang merupakan keyboard dan menggantinya dengan file menggunakan simbol pengalihan input (<), yang mengirimkan data sebagai pengetikan keyboard. Tidak ada sihir!!
Saat Anda mengetik perintah cat tanpa apa-apa, ia menerima input dari STDIN. Setiap baris yang Anda ketik, perintah cat akan mencetak baris tersebut ke layar.
STDOUT
STDOUT adalah singkatan dari output standar, yang merupakan layar secara default.
Anda dapat mengarahkan output ke file menggunakan simbol>>.
Jika kami memiliki file yang berisi data, Anda dapat menambahkan data ke dalamnya menggunakan simbol seperti ini:
pwd >> myfile
Output yang dihasilkan oleh pwd ditambahkan ke myfile tanpa menghapus konten yang ada.
Perintah berikut mencoba mengarahkan output ke file menggunakan simbol>.
ls –l xfile > myfile
Saya tidak memiliki file bernama xfile di PC saya, dan itu menghasilkan kesalahan yang dikirim ke STDERR.
STDERR
Shell mengirimkan kesalahan ke layar secara default.
Jika Anda perlu mengarahkan kesalahan ke file log alih-alih mengirimkannya ke layar, Anda dapat mengalihkan kesalahan menggunakan simbol pengalihan.
Kesalahan pengalihan
Kita dapat mengarahkan kesalahan dengan menempatkan deskriptor file yang 2 sebelum simbol pengalihan seperti ini:
ls -l xfile 2>myfile
cat ./myfile
Seperti yang Anda lihat, kesalahan sekarang ada di file dan tidak ada di layar.
Mengarahkan kesalahan dan keluaran normal
Untuk mengarahkan kesalahan dan output normal, Anda harus mendahului masing-masing dengan deskriptor file yang tepat seperti ini:
ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent
Hasil perintah ls dikirim ke file konten yang benar menggunakan 1> simbol. Dan pesan kesalahan dikirim ke file errorcontent menggunakan 2> simbol.
Anda dapat mengalihkan keluaran dan kesalahan normal ke file yang sama menggunakan &> simbol seperti ini:
ls –l myfile xfile anotherfile &> content
di sini, kami mengarahkan kesalahan dan output normal ke file bernama konten.
Pengalihan keluaran
Ada dua cara untuk pengalihan output:
- Pengalihan sementara.
- Pengalihan permanen.
Pengalihan sementara
Untuk pengalihan sementara, Anda dapat menggunakan simbol>&2 seperti ini:
#!/bin/bash echo "Error message" >&2 echo "Normal message"
Jadi jika kita menjalankannya, kita akan melihat kedua baris tercetak secara normal karena, seperti yang kita ketahui, kesalahan masuk ke layar secara default.
Anda dapat mengarahkan kesalahan ke file seperti ini:
./myscript 2> myfile
Skrip Shell Luar Biasa! Output normal dikirim ke layar, sedangkan pesan echo yang memiliki simbol>&2 mengirimkan error ke file.
Pengalihan permanen
Jika Anda memiliki banyak data yang perlu dialihkan, Anda dapat memiliki pengalihan permanen menggunakan perintah exec seperti ini:
#!/bin/bash exec 1>outfile echo "Permanent redirection" echo "from a shell to a file." echo "without redirecting every line"
Jika kita melihat file bernama outfile, kita akan melihat output dari baris echo.
Kita redirect STDOUT di awal, bagaimana kalau di tengah script seperti ini:
#!/bin/bash exec 2>myerror echo "Script Begining ..." echo "Redirecting Output" exec 1>myfile echo "Output goes to the myfile" echo "Output goes to myerror file" >&2
Perintah exec mengarahkan semua kesalahan ke file myerror, dan kami mengirim output standar ke layar.
Kami menggunakan pernyataan exec 1>myfile untuk mengarahkan output ke file myfile, dan terakhir, kesalahan masuk ke file myerror menggunakan simbol>&2.
Mengalihkan masukan
Anda dapat mengarahkan input ke file alih-alih STDIN menggunakan perintah exec seperti ini:
exec 0< myfile
Perintah ini memberi tahu shell untuk mengambil input dari file bernama myfile alih-alih STDIN dan berikut adalah contohnya:
#!/bin/bash exec 0<testfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done
Pembuatan skrip shell itu mudah.
Anda tahu cara menggunakan perintah baca untuk mendapatkan input pengguna. Jika Anda mengarahkan STDIN ke file, perintah read akan mencoba membaca dari STDIN, yang menunjuk ke file.
Beberapa administrator sistem Linux menggunakan teknik ini untuk membaca file log untuk diproses, dan kami akan membahas lebih banyak cara untuk membaca log pada posting mendatang secara profesional.
Membuat pengalihan khusus
Anda tahu bahwa ada sembilan deskriptor file, Anda hanya menggunakan 3 di antaranya untuk input, output, dan error.
Enam deskriptor file yang tersisa tersedia untuk digunakan untuk pengalihan input dan output.
Kita dapat menggunakan perintah exec untuk menetapkan deskriptor file untuk output seperti ini:
#!/bin/bash exec 3>myfile echo "This line appears on the screen" echo "This line stored on myfile" >&3 echo "This line appears on the screen"
Membuat deskriptor file input
Untuk mengarahkan ulang deskriptor file input lakukan hal berikut:
1- Simpan STDIN ke deskriptor file lain.
2- Mengarahkannya ke file.
3- Kembalikan STDIN ke lokasi aslinya.
Lihat kode berikut untuk memahami langkah-langkah ini:
#!/bin/bash exec 7<&0 exec 0<myfile total=1 while read line; do echo "#$total: $line" total=$(($total + 1)) done exec 0<&7 read -p "Finished? " res case $res in y) echo "Goodbye" ;; n) echo "Sorry, this is the end." ;; esac
Kami menyimpan STDIN ke deskriptor file 7, dan mengarahkan STDIN ke file.
STDIN dikembalikan ke lokasi aslinya setelah mengulangi baris file.
Perintah baca terakhir hanya untuk memastikan bahwa STDIN dikembalikan, dan Anda dapat menggunakan keyboard secara normal.
Tutup deskriptor file
Ketika skrip keluar, deskriptor file akan ditutup secara otomatis. Jika Anda ingin menutup sendiri deskriptor file, arahkan deskriptor file ke simbol ini &- itu akan ditutup.
#!/bin/bash exec 3> myfile echo "Testing ..." >&3 exec 3>&- echo "Nothing works" >&3
Seperti yang Anda lihat, ini memberikan kesalahan deskriptor file yang buruk karena tidak ada lagi.
lsof Command
Perintah lsof digunakan untuk mencantumkan semua file yang dibuka pada sistem dan proses latar belakang.
Pada banyak sistem Linux seperti Fedora, perintah lsof terletak di bawah /usr/sbin.
Ini adalah beberapa opsi penting untuk perintah lsof:
-p:untuk ID proses.
-d:untuk deskriptor file.
Anda bisa mendapatkan PID proses menggunakan variabel $$.
Kita dapat menggunakan -a untuk menggabungkan hasil dari opsi -p dan opsi -d.
Sekarang, uji perintah dari skrip:
#!/bin/bash exec 4> myfile1 exec 5> myfile2 exec 6< myfile3 lsof -a -p $$ -d 0,1,2,4,5,6
Skrip shell membuat deskriptor file 4 dan 5 untuk menulis dan 6 untuk membaca.
Menekan keluaran perintah
Terkadang Anda tidak ingin melihat output apa pun. Kami mengarahkan output ke lubang hitam, yaitu /dev/null .
Misalnya, kita dapat menekan kesalahan seperti ini:
ls -al badfile anotherfile 2> /dev/null
Anda dapat memotong file tanpa menghapusnya sepenuhnya menggunakan perintah yang sama.
cat /dev/null > myfile
Sekarang Anda memahami input, output, cara mengarahkan ulang, cara membuat deskriptor file, dan mengarahkan ulang ke sana.
Saya harap Anda menikmatinya. Terus kembali.
Terima kasih.