Subshell Linux Lanjutan dengan contoh

Subshell Linux Lanjutan dengan contoh

Jika Anda membaca subshells Linux kami sebelumnya untuk pemula dengan artikel Contoh, atau sudah berpengalaman dengan subshells, Anda tahu bahwa subshells adalah cara yang ampuh untuk memanipulasi perintah bash inline, dan dengan cara yang sensitif terhadap konteks konteks.

Dalam tutorial ini Anda akan belajar:

  • Cara membuat perintah subkilas yang lebih canggih
  • Di mana Anda dapat menggunakan subkrell yang lebih canggih dalam kode Anda sendiri
  • Contoh perintah subshell yang lebih canggih
Subshell Linux Lanjutan dengan contoh

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Distribusi Linux-independen
Perangkat lunak Baris perintah bash, sistem berbasis Linux
Lainnya Utilitas apa pun yang tidak termasuk dalam shell bash secara default dapat diinstal menggunakan sudo apt-get install-name utilitas (atau yum bukannya apt-get)
Konvensi # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa

Contoh 1: Menghitung file

$ if [$ (ls [a -z]* 2>/dev/null | wc -l) -gt 0]; Kemudian gema "menemukan satu atau lebih kemunculan file [a-z]*!"; fi 


Di sini kami memiliki jika pernyataan dengan nilai perbandingan pertama sebagai subshell. Ini bekerja dengan baik dan memberikan fleksibilitas dalam jumlah besar ketika datang untuk menulis jika pernyataan. Berbeda dengan binary (benar atau salah) seperti operasi misalnya Jika grep -q 'search_term' ./docfile.txt penyataan. Sebaliknya, dievaluasi sendiri Sebagai perbandingan standar (cocok dengan yang lebih besar-kemudian-nol -GT 0 ayat).

Subshell mencoba untuk daftar daftar direktori bernama [a-z]*, Saya.e. file yang dimulai dengan setidaknya satu huruf di a-z kisaran, diikuti oleh karakter selanjutnya. Itu adalah kesalahan-aman dengan menambahkan 2>/dev/null - Saya.e. kesalahan apa pun yang ditampilkan (aktif Stderr - output kesalahan standar, ditandai oleh 2) akan dialihkan > ke /dev/null - Saya.e. perangkat linux null - dan dengan demikian diabaikan.

Akhirnya kami meneruskan input LS WC -L yang akan menghitung bagi kita berapa banyak baris (atau dalam hal ini, file) terlihat. Jika hasilnya lebih dari 0, catatan informatif ditampilkan.

Perhatikan bagaimana konteks di mana subshell beroperasi. Pertama, dalam hal ini, subshell bekerja di dalam direktori kerja saat ini (i.e. $ Pwd) Yang terutama juga default Saya.e. Subskselteran secara default mulai dengan lingkungan mereka sendiri PWD diatur ke direktori kerja saat ini. Kedua, subshell bekerja di dalam konteks jika penyataan.

Tidak ada output yang dihasilkan oleh perintah ini, karena sedang dieksekusi di dalam direktori kosong. Namun, perhatikan bahwa fakta bahwa tidak ada output yang dihasilkan juga berarti bahwa penindasan kesalahan kami berhasil. Mari kita pastikan itu:

$ if [$ (ls [a -z]* | wc -l) -gt 0]; Kemudian gema "menemukan satu atau lebih kemunculan file [a-z]*!"; fi ls: tidak dapat mengakses '[a-z]*': tidak ada file atau direktori seperti itu 

Kita dapat melihat bagaimana menghapus penindasan kesalahan bekerja pada contoh sebelumnya. Mari selanjutnya buat file dan lihat bagaimana kinerja satu-liner kami:

$ Touch a $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -gt 0]; Kemudian gema "menemukan satu atau lebih kemunculan file [a-z]*!"; fi menemukan satu atau lebih kemunculan file [a-z]*! 


Bagus, sepertinya skrip satu-liner kami berkinerja baik. Mari selanjutnya tambahkan file sekunder, dan lihat apakah kita dapat meningkatkan pesan

$ touch b $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -gt 0]; Kemudian gema "menemukan satu atau lebih kemunculan file [a-z]*!"; fi menemukan satu atau lebih kemunculan file [a-z]*! $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -gt 0]; Kemudian echo "menemukan persis $ (ls [a-z]* 2>/dev/null | wc -l) kemunculan file [a-z]*!"; fi menemukan persis 2 kemunculan file [a-z]*! 

Di sini kita melihat bahwa menambahkan file kedua (oleh sentuh b) tidak membuat perbedaan (seperti yang terlihat pada yang pertama jika perintah), kecuali kita mengubah output untuk benar -benar melaporkan berapa banyak file yang ditemukan dengan memasukkan subshell sekunder ke dalam output.

Namun ini tidak dikodekan secara optimal; Dalam hal ini, dua subkilitas memerlukan eksekusi (biaya pembuatan subkilas sangat minim, tetapi jika Anda memiliki banyak subkilas yang dibuat dalam frekuensi tinggi, biaya tidak penting), dan daftar langsung diminta dua kali (menghasilkan I/O tambahan dan tambahan dan memperlambat kode kami ke kecepatan subsistem I/O dan jenis disk yang digunakan). Mari masukkan ini ke dalam variabel:

$ Count = "$ (ls [a -z]* 2>/dev/null | wc -l)"; if [$ count -gt 0]; lalu gema "menemukan persis $ count kemunculan file [a-z]*!"; fi menemukan persis 2 kemunculan file [a-z]*! 

Besar. Ini adalah kode yang lebih optimal; Subskil tunggal digunakan dan hasilnya disimpan dalam variabel yang kemudian digunakan dua kali, dan hanya pengambilan daftar direktori disk tunggal yang diperlukan. Perhatikan juga bahwa solusi ini mungkin lebih aman.

Misalnya, di jika Pernyataan yang memiliki dua subsklells, jika pada saat eksekusi subkils itu file ketiga dibuat, hasilnya mungkin terlihat seperti ini: Menemukan persis 3 kemunculan file [a-z]*! sedangkan yang pertama jika pernyataan (menggunakan subshell pertama) benar -benar memenuhi syarat Jika 2 -gt 0 - Saya.e. 2. Ini akan membuat sedikit perbedaan dalam kasus ini, tetapi Anda dapat melihat bagaimana dalam beberapa pengkodean ini mungkin menjadi sangat penting untuk diwaspadai.

Contoh 2: Subshells untuk Perhitungan

$ touch z $ echo $ [$ (tanggal + %s) - $ (stat -c %z ./z)] 1 $ echo $ [$ (tanggal + %s) - $ (stat -c %z ./z)] 5 

Di sini kami membuat file, yaitu z, dan kemudian menemukan usia file dalam hitungan detik dengan menggunakan perintah kedua. Beberapa detik kemudian, kami mengeksekusi perintah lagi dan kami dapat melihat file sekarang berusia 5 detik.

Itu tanggal +%s Perintah memberi kita waktu saat ini dalam hitungan detik sejak Epoch (1970-01-01 UTC), dan stat -c %z memberi kami detik sejak zaman untuk file yang sebelumnya dibuat, dan sekarang dirujuk di sini sebagai ./z, Jadi yang perlu kita lakukan hanyalah mengurangi keduanya dari satu sama lain. Kami menempatkan tanggal +%s Pertama karena ini adalah angka tertinggi (waktu saat ini) dan dengan demikian menghitung dengan benar offset dalam detik.

Itu -C opsi untuk Stat Cukup menunjukkan kami menginginkan pemformatan output tertentu, dalam hal ini %Z, atau dengan kata lain waktu sejak zaman. Untuk tanggal Sintaks untuk ide yang sama adalah +%S, meskipun sehubungan dengan waktu saat ini dan tidak terkait dengan file tertentu.

Contoh 3: Subshells di dalam SED dan alat lainnya

$ echo '0'> a $ sed -i "s | 0 | $ (whoami) |" ./A $ CAT A Roel 


Seperti yang Anda lihat, kami dapat menggunakan subshell di hampir semua perintah yang kami jalankan pada baris perintah.

Dalam hal ini, kami membuat file A dengan konten 0 dan selanjutnya inline ganti 0 ke $ (whoami) yang, ketika subkseling dieksekusi sebagai perintah sedang diuraikan, akan menggantikan nama pengguna Roel. Berhati -hatilah untuk tidak menggunakan kutipan tunggal karena ini akan membuat subshell tidak aktif karena string akan ditafsirkan sebagai teks literal:

$ echo '0'> a $ sed -i 's | 0 | $ (whoami) |' ./A $ CAT A $ (whoami) 

Perhatikan di sini bahwa sed Sintaks yang diaktifkan (S | 0 |… |) masih berfungsi dengan benar (!), sedangkan fungsionalitas subkilasi bash $ () tidak!

Contoh 4: Menggunakan eval dan untuk loop

$ Loops = 3 $ echo 1 ... $ loops 1 ... 3 $ eval echo 1 ... $ loops 1 2 3 $ untuk i in $ (echo 1 ... $ loops); do echo "$ i"; selesai 1 ... 3 $ untuk i in $ (eval echo 1 ... $ loops); do echo "$ i"; selesai 1 2 3 

Contoh ini, walaupun bukan cara optimal untuk melakukan yang langsung untuk loop, menunjukkan kepada kita beberapa cara untuk mengintegrasikan subshells bahkan di dalam loop. Kami menggunakan evaluasi pernyataan untuk memproses 1… 3 teks menjadi 1 2 3 yang kemudian dapat digunakan langsung di dalam untuk Klausul Ulangi Loop.

Kadang-kadang, menggunakan subsklell dan menyediakan informasi in-context in-context melalui subshells tidak selalu terbukti dengan sendirinya, dan mungkin memerlukan beberapa pengujian, penyesuaian, dan penyesuaian sebelum subkil dieksekusi seperti yang diharapkan seperti yang diharapkan. Ini normal dan banyak sejalan dengan pengkodean bash normal.

Kesimpulan

Dalam artikel ini, kami mengeksplorasi beberapa contoh yang lebih mendalam dan lanjutan dari menggunakan subshells dalam bash. Kekuatan subshells akan memungkinkan Anda untuk mengubah sebagian besar skrip satu-liner menjadi versi yang jauh lebih kuat daripadanya, belum lagi kemungkinan menggunakannya di dalam skrip Anda. Saat Anda mulai menjelajahi subshells dan menemukan beberapa cara bagus untuk menggunakannya, silakan posting di bawah ini di komentar!

Menikmati!

Tutorial Linux Terkait:

  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Subshells Linux untuk pemula dengan contoh
  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Cara menggunakan subshells bash di dalamnya jika pernyataan
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 22.04 Jammy Jellyfish…
  • Perintah Linux: 20 perintah terpenting teratas yang Anda butuhkan untuk…
  • Perintah Linux Dasar
  • Unduh Linux
  • Instal Arch Linux di VMware Workstation