Pengantar Pengalihan Shell Bash

Pengantar Pengalihan Shell Bash

Objektif

Belajar menggunakan pengalihan, pipa, dan tee di cangkang bash

Sistem Operasi dan Versi Perangkat Lunak

  • Sistem operasi: - Distribusi Linux Agnostik

Persyaratan

  • Akses ke Shell Bash

Konvensi

  • # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
  • $ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Perkenalan

Pengalihan adalah kemampuan untuk mengarahkan kembali input dan output dari berbagai perintah ke dan dari file atau perangkat. Kita akan melihat bagaimana mengarahkan kembali bekerja di bash: shell default di sebagian besar distribusi Linux.



Deskriptor file

Setiap kali Anda menjalankan program, tiga deskriptor file dibuat secara default:

  • 0 - Stdin (Input standar)
  • 1 - stdout (output standar)
  • 2 - Stderr (Kesalahan standar)

Secara default stdout Dan Stderr Deskriptor "dilampirkan" ke layar, artinya output program dan kesalahannya tidak disimpan ke file apa pun, tetapi hanya ditampilkan, sedangkan input standar dilampirkan ke keyboard. Operator pengalihan mari kita memanipulasi asosiasi itu.

Mengarahkan output standar

Seperti yang dikatakan di atas, secara default, output standar dari suatu program dikirim ke layar, tetapi dalam beberapa keadaan, seperti misalnya dalam konteks skrip, kita mungkin ingin membuangnya, atau mungkin mengirimkannya ke file. Bagaimana kita mencapai ini? Kuncinya di sini adalah> operator:

ls -l> output.txt 

Dalam contoh kecil ini, kami mengarahkan output dari ls Perintah ke output file.txt (perhatikan bahwa file tidak perlu ada, dibuat secara otomatis). Tidak ada yang muncul di layar, tetapi jika kita memeriksa konten file, kita akan melihat sesuatu yang cukup akrab:



$ output kucing.txt total 36 drwxr-xr-x. 2 EGDOC EGDOC 4096 22 Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 Juni 02:40 Unduh DRWXRWXR-X. 13 EGDOC EGDOC 4096 23 Juni 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Musik -RW-RW-R--. 1 EGDOC EGDOC 0 Juni 23 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:39 Gambar DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 PUBLIK DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Video 

Apa yang kita lihat adalah output dari ls memerintah. Jika kita sekarang mencoba pengalihan lagi, konten file saat ini akan diganti dengan output baru. Bagaimana kita bisa melestarikan konten sebelumnya, dan adil menambahkan Baris baru untuk itu? Dalam hal ini kami menggunakan >> operator:

ls -l >> output.txt 

Dengan cara ini, jika file tidak ada, atau tidak memiliki konten, pengalihan akan memiliki efek yang sama seperti jika kita menggunakan > Operator, jika tidak, konten baru akan ditambahkan ke yang sudah ada, seperti yang dapat Anda lihat dengan mengamati file lagi:

Total 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 Juni 02:40 Unduh DRWXRWXR-X. 13 EGDOC EGDOC 4096 23 Juni 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Musik -RW-RW-R--. 1 EGDOC EGDOC 0 Juni 23 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:39 Gambar DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 PUBLIK DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Video Total 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 Juni 02:40 Unduh DRWXRWXR-X. 13 EGDOC EGDOC 4096 23 Juni 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Musik -RW-RW-R--. 1 EGDOC EGDOC 541 23 Juni 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:39 Gambar DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 PUBLIK DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 Juni 19:36 Video 


Kita mungkin juga perlu mengarahkan ulang output dari beberapa perintah sekaligus: kita dapat memperoleh hasil yang diinginkan menggunakan kawat gigi keriting untuk mengelompokkannya:

$ echo "linuxconfig"; ls -l; > output.txt

Hasil.file txt, sekarang akan berisi string 'linuxconfig' dan hasil dari ls -l memerintah.

Operasi umum lainnya adalah membuang output perintah sepenuhnya, kali ini mengarahkannya ke perangkat khusus: /dev /null. Dalam sistem operasi seperti Unix /dev/null (juga dikenal sebagai bit bucket), adalah perangkat yang membuang semua data yang ditulis untuk itu:

ls -l> /dev /null

Mengarahkan ulang output standar dan kesalahan standar

Dalam contoh di atas kami baru saja mengarahkan output standar. Jika beberapa jenis kesalahan terjadi, kami masih dapat melihat pesan kesalahan di layar:

$ ls -l nonxistingfile.txt> /dev /null ls: tidak dapat mengakses 'nonxistingfile.txt ': tidak ada file atau direktori seperti itu 

Ini terjadi karena, seperti yang dikatakan di atas, stdout Dan Stderr deskriptor sepenuhnya terpisah satu sama lain. Apa yang bisa kita lakukan, kemudian, untuk mengarahkan mereka berdua? Ada dua sintaksis yang dapat kita gunakan untuk menyelesaikan tugas ini: yang pertama, yang berfungsi bahkan dalam versi lama shell, adalah sebagai berikut:

ls -l> output.txt 2> & 1

Apa yang telah kita lakukan? Pertama -tama kami mengarahkan kembali stdout dari perintah ke output.file txt, seperti yang kami lakukan sebelumnya, lalu kami mengarahkan Stderr ke stdout. Harap perhatikan bagaimana kami mereferensikan deskriptor file dengan nomor masing -masing. Untuk versi Bash yang cukup modern, kita dapat menggunakan sintaks lain yang lebih ramping ini:

ls -l &> output.txt


Mengalihkan output standar ke kesalahan standar

Bayangkan Anda sedang menulis skrip, dan Anda ingin menangani kasus ketika instruksi tertentu gagal, dengan menunjukkan kepada pengguna pesan kesalahan. Bagaimana Anda mencapai ini? Hal pertama yang terlintas dalam pikiran adalah gema pesan yang diinginkan dan kemudian mungkin keluar dari skrip dengan kode kesalahan yang sesuai. Ini akan baik -baik saja, tetapi tanyakan pada diri sendiri, tentang deskriptor apa pesan ini akan 'dikirim'? Ini adalah stdout dari gema perintah, tetapi pada saat yang sama, jika kita melihat sesuatu dari perspektif skrip, sebagai pesan kesalahan, itu harus menggunakan Stderr deskriptor. Yang ingin kami lakukan di sini, adalah mengarahkan ulang stdout ke Stderr. Kami menggunakan sintaks berikut untuk menyelesaikan tugas:

echo "Terjadi kesalahan, bye!"> & 2

Tentunya itu bukan yang paling berguna dari pesan kesalahan, tetapi cukup untuk contoh kami.

Mengarahkan kembali input standar

Seperti yang kami katakan sebelumnya, secara default, input standar dikaitkan dengan keyboard, tetapi dengan menggunakan < Operator, kami dapat membuat beberapa program untuk menerima masukan dari sumber lain. Mari kita lihat contoh cepat menggunakan tr Perintah (seperti yang mungkin Anda ketahui tr digunakan untuk menghapus atau menerjemahkan karakter). Biasanya bekerja dengan cara ini:

Tr 'Goot Tay!'t d

Anda memberikan tr string, pertama -tama menentukan karakter yang ingin Anda ubah, dan kemudian yang harus digunakan untuk menggantikannya. Dalam hal ini kita melewati string 'goot tay!'Secara langsung, dengan menggunakan keyboard: itu akan diterjemahkan ke' hari yang baik!'. Apa yang akan kami lakukan untuk menunjukkan Stdin pengalihan, adalah menulis string ke file dan kemudian mengarahkan kembali konten file ke Stdin dari tr memerintah.

Pertama kami menulis 'Goot Tay!'ke output.file txt

$ echo 'goot tay!'> output.txt

Lalu kami mengirim kontennya ke Stdin dari tr:

$ tr < output.txt t d good day! 

Seperti yang Anda lihat semuanya berjalan seperti yang diharapkan, dan pesan yang bagus telah dicetak di layar.



Saluran pipa

Menggunakan operator pipa | kita dapat menghubungkan beberapa perintah bersama -sama, sehingga stdout dari perintah di sebelah kiri operator diteruskan ke Stdin dari perintah di sebelah kanannya. Kita dapat dengan cepat menunjukkan ini, dengan menggunakan tr Perintah lagi:

$ echo 'hari goot!'| TR T D HARI YANG BAIK! 

Apa yang telah terjadi? Output standar dari perintah Echo (terdiri dari string 'Goot Tay!') adalah disalurkan ke input standar dari tr perintah, yang menerjemahkan string. Akhirnya, kita lihat tr output standar di layar. Tapi tentu saja pipa itu bisa berlanjut. Bayangkan kita ingin kata 'bagus' untuk ditampilkan:

$ echo 'goot tay!'| TR T D | cut -f 1 -d "

Apa yang telah kami lakukan di sini adalah menambahkan memotong Perintah ke pipa, melewati stdout dari tr untuk itu Stdin. Itu memotong Perintah menggunakan ruang sebagai pembatas (-D sakelar) dan pilih hanya bidang pertama, mengembalikan string 'bagus'.

Menggunakan tee

Itu tee Perintah membaca input standar dan mengarahkan kembali ke output standar dan ke file secara bersamaan, memungkinkan untuk membuat 'T' di pipa kami. Mari kita gunakan kembali contoh di atas, kali ini mengirimkan hasil perantara ('Selamat siang!') juga ke output.File txt:

$ echo 'goot tay!'| TR T D | tee ouput.txt | cut -f 1 -d "

Output di layar akan sama seperti sebelumnya ('bagus'), tetapi jika kita membaca output.file txt, kita dapat melihat bahwa 'hari baik!'String telah ditulis untuk itu. Ini karena 'hari yang baik!'adalah output standar yang mengalir di dalam pipa saat kami memasukkan kami tee.

Tee juga berguna adalah beberapa keadaan tertentu. Misalnya, jika Anda mencoba 'menggemakan' sesuatu ke file yang membutuhkan hak istimewa root untuk ditulis, Anda akan melihat bahwa hal -hal tidak akan berjalan seperti yang diharapkan:

$ sudo echo "linuxconfig.org "> dilindungi.txt -bash: dilindungi.txt: izin ditolak 


Apa yang telah terjadi? Anda mungkin mengharapkan perintah itu berhasil, karena Anda diawali dengan sudo, tetapi tetap gagal. Ini karena Anda baru saja menjalankan gema Perintah dengan hak istimewa, tetapi itu tidak memberi Anda izin tulis pada file. Mari kita coba seperti ini sebagai gantinya:

$ echo "linuxconfig.org "| sudo tee dilindungi.txt> /dev /null

Di sini kami menjalankan Echo sebagai pengguna normal, tetapi pengalihan itu sendiri dilakukan dengan hak akar, jadi kali ini perintah berhasil. Kami juga menambahkan pengalihan ekstra ke /dev/null, Karena kami tidak membutuhkan output untuk ditampilkan di layar.

Perhatikan bahwa menggunakan teknik ini, output tidak akan ditambahkan ke file tujuan: yang terakhir akan ditimpa, dan konten sebelumnya akan hilang. Untuk menambahkan file, kita harus menambahkan -A beralih ke tee (pendek untuk -pend).

Hati -hati, hanya sedikit gangguan di sini dapat menyebabkan hal -hal mengerikan!

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Pengantar Pipa Bernama di Bash Shell
  • Menangani input pengguna dalam skrip bash
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Menguasai loop skrip bash
  • File Konfigurasi Linux: 30 Teratas Paling Penting
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Can Linux mendapatkan virus? Menjelajahi kerentanan Linux…
  • Unduh Linux