GNU/Linux >> Belajar Linux >  >> Linux

Dijelaskan:Input, Output, dan Redirection Error di Linux

Jika Anda terbiasa dengan perintah dasar Linux, Anda juga harus mempelajari konsep pengalihan input output.

Anda sudah tahu bagaimana fungsi perintah Linux. Dibutuhkan input dan memberi Anda output. Ada beberapa pemain di tempat kejadian di sini. Biarkan saya memberi tahu Anda tentang mereka.

Stdin, stdout, dan stderr

Saat Anda menjalankan perintah Linux, ada tiga aliran data yang berperan di dalamnya:

  • Input standar (stdin) adalah sumber input data. Secara default, stdin adalah teks apa pun yang dimasukkan dari keyboard. ID streamingnya adalah 0.
  • Output standar (stdout) adalah hasil dari perintah. Secara default, ini ditampilkan di layar. ID streamingnya adalah 1.
  • Kesalahan standar (stderr) adalah pesan kesalahan (jika ada) yang dihasilkan oleh perintah. Secara default, stderr juga ditampilkan di layar. ID streamingnya adalah 2.

Aliran ini berisi data dalam teks biasa dalam apa yang disebut memori buffer.

Anggap saja sebagai aliran air. Anda membutuhkan sumber air, keran misalnya. Anda menghubungkan pipa ke sana dan Anda dapat menyimpannya di ember (file) atau menyirami tanaman (mencetaknya). Anda juga dapat menghubungkannya ke ketukan lain, jika diperlukan. Pada dasarnya, Anda mengarahkan air.

Linux juga memiliki konsep pengalihan ini, di mana Anda dapat mengarahkan ulang stdin, stdout, dan stderr dari tujuan biasanya ke file atau perintah lain (atau bahkan perangkat periferal seperti printer).

Biarkan saya menunjukkan bagaimana pengalihan bekerja dan bagaimana Anda dapat menggunakannya.

Pengalihan output

Bentuk pengalihan pertama dan paling sederhana adalah pengalihan keluaran yang juga disebut pengalihan stdout.

Anda sudah tahu bahwa secara default, output dari sebuah perintah ditampilkan di layar. Sebagai contoh, saya menggunakan perintah ls untuk membuat daftar semua file dan ini adalah output yang saya dapatkan:

[email protected]:~$ ls
appstxt  new.txt  static-ip.txt

Dengan pengalihan output, Anda dapat mengarahkan output ke file. Jika file keluaran ini tidak ada, shell akan membuatnya.

command > file

Sebagai contoh, izinkan saya menyimpan output dari perintah ls ke file bernama output.txt:

[email protected]:~$ ls > output.txt

File output dibuat sebelumnya

Menurut Anda apa isi file keluaran ini? Biarkan saya menggunakan perintah cat untuk memberi Anda kejutan:

[email protected]:~$ cat output.txt 
appstxt
new.txt
output.txt
static-ip.txt

Apakah Anda memperhatikan bahwa penyertaan output.txt di sana ? Saya sengaja memilih contoh ini untuk menunjukkan ini kepada Anda.

File output yang mengarahkan stdout dibuat sebelum perintah yang dimaksud dijalankan. Mengapa? Karena itu perlu memiliki tujuan keluaran yang siap ke mana keluaran akan dikirim.

Tambahkan bukan clobber

Salah satu masalah yang sering diabaikan adalah jika Anda mengarahkan ulang ke file yang sudah ada, shell akan menghapus (menghancurkan) file terlebih dahulu. Ini berarti konten file output yang ada akan dihapus dan diganti dengan output dari perintah.

Anda dapat menambahkan, alih-alih menimpanya, menggunakan sintaks>> redirection.

command >> file

Kiat :Anda dapat melarang clobbering di sesi shell saat ini menggunakan:set -C

Mengapa Anda mengarahkan stdout? Anda dapat menyimpan output untuk referensi di masa mendatang dan menganalisisnya nanti. Ini sangat membantu ketika output perintah terlalu besar dan memakan semua layar Anda. Ini seperti mengumpulkan log.

Pengalihan pipa

Sebelum Anda melihat pengalihan stdin, Anda harus mempelajari tentang pengalihan pipa. Ini lebih umum dan mungkin Anda akan sering menggunakannya.

Dengan pengalihan pipa, Anda mengirim output standar dari suatu perintah ke input standar dari perintah lain.

command 1 | command 2

Mari saya tunjukkan contoh praktis. Katakanlah, Anda ingin menghitung jumlah file yang terlihat di direktori saat ini. Anda dapat menggunakan ls -1 (ini angka satu, bukan huruf L) untuk menampilkan file di direktori saat ini:

[email protected]:~$ ls -1
appstxt
new.txt
output.txt
static-ip.txt

Anda mungkin sudah tahu bahwa perintah wc digunakan untuk menghitung jumlah baris dalam sebuah file. Jika Anda menggabungkan kedua perintah ini dengan pipa, inilah yang Anda dapatkan:

[email protected]:~$ ls -1 | wc -l
4

Dengan pipa, kedua perintah berbagi buffer memori yang sama. Output dari perintah pertama disimpan dalam buffer dan buffer yang sama kemudian digunakan sebagai input untuk perintah berikutnya.

Anda akan melihat hasil dari perintah terakhir di dalam pipeline. Itu jelas karena stdout dari perintah sebelumnya diumpankan ke perintah berikutnya alih-alih pergi ke layar.

Pengalihan pipa atau pemipaan tidak terbatas pada menghubungkan hanya dua perintah. Anda dapat menghubungkan lebih banyak perintah selama output dari satu perintah dapat digunakan sebagai input dari perintah berikutnya.

command_1 | command_2 | command_3 | command_4

Ingat stdout/stdin adalah sepotong data, bukan nama file

Beberapa pengguna Linux baru menjadi bingung saat menggunakan pengalihan. Jika sebuah perintah mengembalikan sekelompok nama file sebagai output, Anda tidak dapat menggunakan nama file tersebut sebagai argumen.

Misalnya, jika Anda menggunakan perintah find untuk menemukan semua file yang diakhiri dengan .txt, Anda tidak dapat meneruskannya melalui pipa untuk memindahkan file yang ditemukan ke direktori baru, tidak secara langsung seperti ini:

find . -type f -name "*.txt" | mv destination_directory

Inilah sebabnya mengapa Anda akan sering melihat perintah find digunakan dalam konjugasi dengan perintah exec atau xargs. Perintah khusus ini 'mengubah teks dengan sekelompok nama file menjadi nama file' yang dapat diteruskan sebagai argumen.

find . -type f -name "*.txt" | xargs -t -I{} mv {} ../new_dir

Pengalihan input

Anda dapat menggunakan pengalihan stdin untuk meneruskan konten file teks ke perintah seperti ini:

command < file

Anda tidak akan melihat stdin banyak digunakan. Itu karena sebagian besar perintah Linux menerima nama file sebagai argumen dan dengan demikian pengalihan stdin seringkali tidak diperlukan.

Ambil contoh ini:

head < filename.txt

Perintah di atas bisa saja head filename.txt (tanpa <).

Bukannya pengalihan stdin sama sekali tidak berguna. Beberapa perintah bergantung padanya. Ambil perintah tr misalnya. Perintah ini dapat melakukan banyak hal tetapi dalam contoh di bawah ini, ia mengubah teks input dari huruf kecil ke huruf besar:

tr a-z A-Z < filename.txt

Sebenarnya, penggunaan stdin disarankan melalui pipa khusus untuk menghindari penggunaan perintah cat yang tidak perlu.

Misalnya, banyak orang akan menggunakan contoh di atas dengan cat dan kemudian menggunakan tr di atasnya. Terus terang, tidak perlu menggunakan cat di sini.

cat filename.txt | tr a-z A-Z

Gabungkan pengalihan

Anda dapat menggabungkan pengalihan stdin, stdout, dan pipa sesuai kebutuhan Anda.

Misalnya, perintah di bawah ini mencantumkan semua file .txt di direktori saat ini dan kemudian menghitung file .txt tersebut dan menyimpan hasilnya ke file baru.

ls *.txt | wc -l > count.txt

Pengalihan kesalahan

Terkadang ketika Anda menjalankan beberapa perintah atau skrip, Anda akan melihat bahwa itu menampilkan pesan kesalahan di layar.

[email protected]:~$ ls -l ffffff > output.txt
ls: cannot access 'ffffff': No such file or directory

Di awal artikel ini, saya menyebutkan bahwa ada tiga aliran data dan stderr adalah salah satu aliran data keluaran yang ditampilkan di layar secara default.

Anda juga dapat mengarahkan ulang stderr. Karena ini adalah aliran data keluaran, Anda dapat menggunakan simbol pengalihan> atau>> yang sama dengan yang Anda gunakan untuk pengalihan stdout.

Tetapi bagaimana Anda membedakan antara stdout dan stderr ketika keduanya merupakan aliran data keluaran? Menurut ID streaming mereka (juga disebut deskriptor file).

Aliran Data ID Aliran
stdin 0
stdout 1
stderr 2
-t, –daftar
-u, –perbarui
-x, –ekstrak, –dapatkan
-j, –bzip2
-z, –gzip, –gunzip, –ungzip

Secara default ketika Anda menggunakan simbol pengalihan keluaran>, itu sebenarnya berarti 1>. Dengan kata lain, Anda mengatakan bahwa aliran data dengan ID 1 sedang dikeluarkan di sini.

Ketika Anda harus mengarahkan ulang stderr, Anda menggunakan ID-nya seperti 2> atau 2>>. Ini menandakan bahwa pengalihan output adalah untuk aliran data stderr (ID 2).

Contoh pengalihan Stderr

Mari saya tunjukkan kepada Anda dengan beberapa contoh. Misalkan Anda hanya ingin menyimpan kesalahan, Anda dapat menggunakan sesuatu seperti ini:

[email protected]:~$ ls fffff 2> error.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'fffff': No such file or directory

Itu sederhana. Mari kita membuatnya sedikit lebih rumit (dan berguna):

[email protected]:~$ ls -l new.txt ffff > output.txt 2> error.txt 
[email protected]:~$ cat output.txt 
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt
[email protected]:~$ cat error.txt 
ls: cannot access 'ffff': No such file or directory

Pada contoh di atas, perintah ls mencoba menampilkan dua file. Untuk satu file itu berhasil dan untuk yang lain, itu mendapat kesalahan. Jadi yang saya lakukan di sini adalah mengarahkan ulang stdout ke ouput.txt (dengan>) dan stderr ke error.txt (dengan 2>).

Anda juga dapat mengarahkan stdout dan stderr ke file yang sama. Ada beberapa cara untuk melakukannya.

Pada contoh di bawah ini, pertama saya mengirim stderr (dengan 2>>) ke file Combined.txt dalam mode append. Dan kemudian, stdout (dengan>>) dikirim ke file yang sama dalam mode append.

[email protected]:~$ ls -l new.txt fff 2>> combined.txt >> combined.txt 
[email protected]:~$ cat combined.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Cara lain, dan ini yang lebih disukai, adalah dengan menggunakan sesuatu seperti 2>&1. Yang secara kasar dapat diterjemahkan menjadi "redirect stderr ke alamat yang sama dengan stdout".

Mari kita ambil contoh sebelumnya dan kali ini gunakan 2>&1 untuk mengarahkan kedua stdout dan stderr ke file yang sama.

[email protected]:~$ ls -l new.txt fff > output.txt 2>&1
[email protected]:~$ cat output.txt 
ls: cannot access 'fff': No such file or directory
-rw-rw-r-- 1 abhishek abhishek 0 May  5 10:25 new.txt

Ingatlah bahwa Anda tidak dapat menggunakan 2>>&1 untuk menggunakannya dalam mode penambahan. 2>&1 sudah masuk ke mode penambahan.

Anda juga dapat menggunakan 2> terlebih dahulu dan kemudian menggunakan 1>&2 untuk mengarahkan stdout ke file yang sama dengan stderr. Pada dasarnya, ">&" yang mengalihkan satu aliran data keluar ke aliran data lainnya.

Ringkasan

  • Ada tiga aliran data. Satu input, stdin (0) dan dua aliran data output stdout (1) dan stderr (2).
  • Keyboard adalah perangkat stdin default dan layar adalah perangkat output default.
  • Pengalihan output digunakan dengan> atau>> (untuk mode penambahan).
  • Pengalihan input digunakan dengan <.
  • Stderr dapat dialihkan menggunakan 2> atau 2>>.
  • Stderr dan stdout dapat digabungkan menggunakan 2>&1.

Karena Anda belajar tentang redirection, Anda juga harus tahu tentang perintah tee. Perintah ini memungkinkan Anda untuk menampilkan ke output standar dan menyimpan ke file secara bersamaan.

Saya harap Anda menyukai panduan terperinci ini tentang pengalihan di Linux. Jika Anda masih ragu atau memiliki saran untuk menyempurnakan artikel ini, beri tahu saya di bagian komentar.


Linux
  1. Perintah Sejarah di Linux Dijelaskan Secara Mendalam

  2. Perintah Linux:pekerjaan, bg, dan fg

  3. Pengalihan Input/Output di Linux/Unix

  1. Bekerja dengan Input Output dan Error Redirection di Linux

  2. $_ Vs !$. Argumen Terakhir Dari Perintah Sebelumnya Dan Pengalihan Output?

  3. ls Perintah di Linux:17 Contoh yang Berguna Dijelaskan

  1. Perintah tar Linux Dijelaskan

  2. Pipes dan Redirection di Linux - Dijelaskan!

  3. Bagaimana cara menafsirkan dan memperbaiki kesalahan Input/output di Linux?