Pengantar Pengalihan Shell Bash
- 4852
- 517
- Darryl Ritchie
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