GNU/Linux >> Belajar Linux >  >> Linux

Cara mengarahkan ulang keluaran perintah shell

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:

  1. Output tentang file yang ada dikirim dengan benar ke file tujuan.
  2. 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:

Gambar

Pada contoh di atas:

  1. ls perintah tidak menampilkan pesan kesalahan di layar seperti sebelumnya.
  2. Keluaran normal berisi apa yang saya harapkan.
  3. 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 ke grep 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.


Linux
  1. Cara Mengarahkan Output ke File dan Stdout di Linux

  2. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  3. Cara mengarahkan output ke file dan stdout

  1. Cara mengarahkan output dari proses yang sudah berjalan

  2. Bagaimana cara mengarahkan output dari system() ke file?

  3. Bagaimana cara mengarahkan output dari perintah waktu ke file di Linux?

  1. Output perintah dialihkan ke file dan terminal

  2. Cara mengarahkan output dari layanan systemd ke file

  3. Cara mengarahkan seluruh output dari spark-submit ke file