Pengenalan kepada pengalihan shell bash

Pengenalan kepada pengalihan shell bash

Objektif

Belajar menggunakan pengalihan, paip dan tee di shell bash

Sistem operasi dan versi perisian

  • Sistem operasi: - Pengedaran Linux Agnostik

Keperluan

  • Akses ke kerang bash

Konvensyen

  • # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
  • $ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Pengenalan

Pengalihan adalah keupayaan untuk mengalihkan input dan output pelbagai arahan ke dan dari fail atau peranti. Kami akan melihat bagaimana pengalihan berfungsi di bash: shell lalai dalam majoriti pengagihan linux.



Deskriptor fail

Setiap kali anda melaksanakan program, tiga deskriptor fail dibuat secara lalai:

  • 0 - stdin (input standard)
  • 1 - stdout (output standard)
  • 2 - stderr (kesalahan biasa)

Secara lalai stdout dan stderr Deskriptor "dilampirkan" ke skrin, yang bermaksud bahawa output program dan kesilapannya tidak disimpan ke mana -mana fail, tetapi hanya dipaparkan, sementara input standard dilampirkan ke papan kekunci. Pengendali pengalihan marilah kita memanipulasi persatuan tersebut.

Mengalihkan output standard

Seperti yang dikatakan di atas, secara lalai, output standard program dihantar ke skrin, tetapi dalam beberapa keadaan, sebagai contoh dalam konteks skrip, kita mungkin mahu membuangnya, atau mungkin menghantarnya ke fail. Bagaimana kita mencapai ini? Kunci di sini ialah> pengendali:

ls -l> output.txt 

Dalam contoh kecil ini, kami mengalihkan output ls Perintah ke output fail.TXT (perhatikan bahawa fail tidak perlu wujud, ia dibuat secara automatik). Tidak ada yang muncul di skrin, tetapi jika kita menyemak kandungan fail, kita akan melihat sesuatu yang agak biasa:



$ output kucing.TXT Jumlah 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Muat turun DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 MUSIK -RW-RW-R--. 1 EGDOC EGDOC 0 Jun 23 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:39 Gambar DrWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 AWAM DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Video 

Apa yang kita lihat ialah output dari ls perintah. Sekiranya kita sekarang mencuba pengalihan semula, kandungan semasa fail akan digantikan dengan output baru. Bagaimana kita dapat mengekalkan kandungan sebelumnya, dan hanya tambah baris baru untuknya? Dalam kes ini kita menggunakan >> Operator:

ls -l >> output.txt 

Dengan cara ini, jika fail tidak wujud, atau tidak mempunyai kandungan, pengalihan akan mempunyai kesan yang sama seolah -olah kita menggunakan > Operator, jika tidak, kandungan baru akan dilampirkan kepada yang sedia ada, seperti yang anda lihat dengan memerhatikan fail lagi:

Jumlah 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Muat turun DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 MUSIK -RW-RW-R--. 1 EGDOC EGDOC 0 Jun 23 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:39 Gambar DrWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 AWAM DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Video Jumlah 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Desktop DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Dokumen DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 23 02:40 Muat turun DRWXRWXR-X. 13 EGDOC EGDOC 4096 Jun 23 08:13 GIT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 MUSIK -RW-RW-R--. 1 EGDOC EGDOC 541 Jun 23 09:38 Output.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:39 Gambar DrWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 AWAM DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Templat DRWXR-XR-X. 2 EGDOC EGDOC 4096 Jun 22 19:36 Video 


Kita juga mungkin perlu mengalihkan output pelbagai arahan sekaligus: kita boleh mendapatkan hasil yang dikehendaki menggunakan pendakap keriting untuk mengumpulkannya:

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

Output.fail txt, kini akan mengandungi kedua -dua rentetan 'linuxconfig' dan hasil dari ls -l perintah.

Operasi biasa yang lain adalah membuang output arahan sepenuhnya, kali ini mengalihkannya ke peranti khas: /dev /null. Dalam sistem operasi seperti Unix /dev/null (juga dikenali sebagai Bitdle Bit), adalah peranti yang membuang semua data yang ditulis kepadanya:

ls -l> /dev /null

Galakan kedua -dua output standard dan ralat standard

Dalam contoh di atas kita hanya mengalihkan output standard. Jika beberapa jenis ralat berlaku, kami masih dapat melihat mesej ralat di skrin:

$ ls -l nonexistingfile.txt> /dev /null ls: tidak dapat mengakses 'nonexistingfile.txt ': Tiada fail atau direktori sedemikian 

Ini berlaku kerana, seperti yang dikatakan di atas, stdout dan stderr Deskriptor dipisahkan sepenuhnya antara satu sama lain. Apa yang boleh kita lakukan, maka, untuk mengalihkannya kedua -duanya? Terdapat dua sintaks yang boleh kita gunakan untuk menyelesaikan tugas ini: yang pertama, yang berfungsi walaupun dalam versi lama shell, adalah yang berikut:

ls -l> output.txt 2> & 1

Apa yang telah kita lakukan? Pertama sekali kita mengalihkan stdout arahan ke output.fail txt, seperti yang kita lakukan sebelum ini, maka kita mengalihkan stderr kepada stdout. Sila perhatikan bagaimana kami merujuk deskriptor fail dengan nombor masing -masing. Untuk versi bash moden yang agak moden, kita boleh menggunakan sintaks yang lain dan lebih efisien ini:

ls -l &> output.txt


Mengalihkan output standard ke ralat standard

Bayangkan anda menulis skrip, dan anda ingin mengendalikan kes apabila arahan tertentu gagal, dengan menunjukkan pengguna mesej ralat. Bagaimana anda akan mencapai ini? Perkara pertama yang masuk ke dalam fikiran adalah dengan adil echo mesej yang dikehendaki dan kemudian mungkin keluar dari skrip dengan kod ralat yang sesuai. Ini akan baik -baik saja, tetapi tanya diri anda, mengenai deskriptor apa mesej ini akan 'dihantar'? Ia adalah stdout daripada echo perintah, tetapi pada masa yang sama, jika kita melihat sesuatu dari perspektif skrip, sebagai mesej ralat, ia harus menggunakan stderr deskriptor. Apa yang kita mahu lakukan di sini, adalah untuk mengalihkan stdout ke stderr. Kami menggunakan sintaks berikut untuk menyelesaikan tugas:

echo "ralat berlaku, bye!"> & 2

Pasti ia bukan yang paling berguna dari mesej ralat, tetapi sudah cukup untuk contoh kami.

Mengalihkan input standard

Seperti yang kita katakan sebelum ini, secara lalai, input standard dikaitkan dengan papan kekunci, tetapi dengan menggunakan < pengendali, kita boleh membuat beberapa program untuk menerima input dari sumber lain. Mari lihat contoh cepat menggunakan tr perintah (seperti yang anda mungkin tahu tr digunakan untuk memadam atau menterjemahkan watak). Biasanya berfungsi dengan cara ini:

tr 'goot tay!'t d

Awak beri tr rentetan, terlebih dahulu menyatakan watak yang ingin anda ubah, dan kemudian yang harus digunakan untuk menggantikannya. Dalam kes ini kita lulus rentetan 'goot tay!'Secara langsung, dengan menggunakan papan kekunci: ia akan diterjemahkan ke' hari yang baik!'. Apa yang akan kita lakukan untuk menunjukkan stdin pengalihan semula, adalah menulis rentetan ke fail dan kemudian mengalihkan kandungan fail ke stdin daripada tr perintah.

Mula -mula kita menulis 'Goot Tay!'ke output.fail txt

$ echo 'goot tay!'> output.txt

Kemudian kami menghantar kandungannya ke stdin dari tr:

$ tr < output.txt t d good day! 

Seperti yang anda lihat semuanya berjalan seperti yang diharapkan, dan mesej yang bagus telah dicetak di skrin.



Saluran paip

Menggunakan operator paip | kita dapat mengikat pelbagai arahan bersama, sehingga stdout arahan di sebelah kiri pengendali dihantar ke stdin arahan di sebelah kanannya. Kita dapat dengan cepat menunjukkan ini, dengan menggunakan tr perintah lagi:

$ echo 'hari goot!'| Hari yang baik! 

Apa yang berlaku? Output standard perintah echo (yang terdiri daripada rentetan 'goot tay!') adalah paip kepada input standard tr perintah, yang menerjemahkan rentetan. Akhirnya, kita lihat tr output standard pada skrin. Tetapi sudah tentu paip dapat diteruskan. Bayangkan kita mahu hanya perkataan 'baik' yang dipaparkan:

$ echo 'goot tay!'| tr t d | potong -f 1 -d "

Apa yang telah kita lakukan di sini adalah untuk menambah potong perintah ke paip, lulus stdout dari tr kepada yang stdin. The potong Perintah menggunakan ruang sebagai pembatas (-d suis) dan hanya memilih medan pertama, mengembalikan rentetan 'baik'.

Menggunakan tee

The tee Perintah membaca input standard dan mengalihkannya ke output standard dan ke fail pada masa yang sama, memungkinkan untuk membuat 't' di paip kami. Mari kita gunakan semula contoh di atas, kali ini menghantar hasil pertengahan ('hari yang baik!') juga kepada output.Fail txt:

$ echo 'goot tay!'| tr t d | tee ouput.txt | potong -f 1 -d "

Output pada skrin akan sama seperti sebelumnya ('baik'), tetapi jika kita membaca output.fail txt, kita dapat melihat bahawa 'hari yang baik!'String telah ditulis kepadanya. Ini kerana 'hari yang baik!'Adakah output standard mengalir di dalam paip ketika kami memasukkan kami tee.

Tee juga berguna adalah beberapa keadaan tertentu. Sebagai contoh, jika anda cuba 'echo' sesuatu ke fail yang memerlukan keistimewaan root untuk ditulis, anda akan melihat bahawa perkara tidak akan pergi seperti yang diharapkan:

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


Apa yang berlaku? Anda mungkin menjangkakan perintah itu berjaya, kerana anda mengutamakannya dengan sudo, tetapi ia gagal pula. Ini kerana anda hanya berlari echo perintah dengan keistimewaan, tetapi itu tidak memberi anda kebenaran menulis pada fail. Mari cuba dengan cara ini:

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

Di sini kita menjalankan Echo sebagai pengguna biasa, tetapi pengalihan itu sendiri dilakukan dengan keistimewaan root, jadi kali ini perintah berjaya. Kami juga menambah pengalihan tambahan ke /dev/null, kerana kita tidak memerlukan output yang akan dipaparkan di skrin.

Perhatikan bahawa menggunakan teknik ini, output tidak akan dilampirkan ke fail destinasi: yang terakhir akan ditimpa, dan kandungan terdahulu akan hilang. Untuk menambah fail, kita mesti menambah -a bertukar kepada tee (Pendek untuk -Penghibatan).

Berhati -hati, hanya sedikit gangguan di sini boleh menyebabkan perkara yang mengerikan!

Tutorial Linux Berkaitan:

  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Pengenalan kepada Paip Dinamakan di Bash Shell
  • Mengendalikan input pengguna dalam skrip bash
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Menguasai Gelung Skrip Bash
  • Fail Konfigurasi Linux: 30 teratas yang paling penting
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Bolehkah linux mendapat virus? Meneroka kelemahan Linux ..
  • Muat turun linux