Pengenalan kepada pengalihan shell bash
- 1652
- 339
- Don Will
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