GNU/Linux >> Belajar Linux >  >> Linux

Kekuatan (Shell) untuk orang-orang

Awal tahun ini, PowerShell Core menjadi tersedia secara umum di bawah lisensi Open Source (MIT). PowerShell bukanlah teknologi baru. Sejak rilis pertamanya untuk Windows pada tahun 2006, pembuat PowerShell berusaha untuk menggabungkan kekuatan dan fleksibilitas shell Unix sambil memperbaiki kekurangan yang mereka rasakan, terutama kebutuhan untuk manipulasi teks untuk mendapatkan nilai dari menggabungkan perintah.

Lima rilis utama kemudian, PowerShell Core memungkinkan shell inovatif yang sama dan lingkungan perintah untuk berjalan secara native di semua sistem operasi utama, termasuk OS X dan Linux. Beberapa (baca:hampir semua orang ) mungkin masih mencemooh keberanian dan/atau keberanian penyusup kelahiran Windows ini untuk menawarkan dirinya ke platform yang telah memiliki lingkungan shell yang kuat sejak dahulu kala (setidaknya seperti yang didefinisikan oleh milenium). Dalam posting ini, saya berharap PowerShell dapat memberikan keuntungan bahkan bagi pengguna yang sudah berpengalaman.

Konsistensi di seluruh platform

Jika Anda berencana untuk memindahkan skrip dari satu lingkungan eksekusi ke lingkungan eksekusi lainnya, Anda perlu memastikan bahwa Anda hanya menggunakan perintah dan sintaks yang berfungsi. Misalnya, pada sistem GNU, Anda akan mendapatkan tanggal kemarin sebagai berikut:

date --date="1 day ago" 

Pada sistem BSD (seperti OS X), sintaks di atas tidak akan berfungsi, karena utilitas tanggal BSD memerlukan sintaks berikut:

date -v -1d 

Karena PowerShell dilisensikan di bawah lisensi permisif dan dibuat untuk semua platform, Anda dapat mengirimkannya dengan aplikasi Anda. Jadi, ketika skrip Anda berjalan di lingkungan target, skrip tersebut akan berjalan di shell yang sama menggunakan implementasi perintah yang sama dengan lingkungan tempat Anda menguji skrip.

Objek dan data terstruktur

*perintah dan utilitas nix bergantung pada kemampuan Anda untuk menggunakan dan memanipulasi data tidak terstruktur. Mereka yang telah hidup bertahun-tahun dengan sed grep dan awk mungkin tidak terganggu oleh pernyataan ini, tetapi ada cara yang lebih baik.

Mari kita ulangi contoh tanggal kemarin di PowerShell. Untuk mendapatkan tanggal saat ini, jalankan Get-Date cmdlet (diucapkan "commandlet"):

> Dapatkan-Tanggal                         

Minggu, 21 Januari 2018 20:12:41

Output yang Anda lihat sebenarnya bukan string teks. Sebaliknya, ini adalah representasi string dari objek .Net Core. Sama seperti objek lain di lingkungan OOP lainnya, objek ini memiliki tipe dan paling sering, metode yang dapat Anda panggil.

Mari kita buktikan ini:

> $(Get-Date).GetType().FullName
System.DateTime

$(...) sintaks berperilaku persis seperti yang Anda harapkan dari shell POSIX—hasil evaluasi perintah dalam tanda kurung diganti untuk seluruh ekspresi. Namun, di PowerShell, $ benar-benar opsional dalam ekspresi tersebut. Dan yang terpenting, hasilnya adalah objek .Net, bukan teks. Jadi kita bisa memanggil GetType() metode pada objek itu untuk mendapatkan objek tipenya (mirip dengan Class objek di Java), dan FullName properti untuk mendapatkan nama lengkap jenisnya.

Jadi, bagaimana orientasi objek ini membuat hidup Anda lebih mudah?

Pertama, Anda dapat menyalurkan objek apa pun ke Get-Member cmdlet untuk melihat semua metode dan properti yang ditawarkan.

> (Dapatkan-Tanggal) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | Dapatkan-Member        


   TypeName:System.DateTime

Name                 MemberType     Definisi                            ---------
Tambahkan Metode DateTime Tambah (Nilai TimesPan) Metode Addmilliseconds (Nilai ganda)
Addminutes Metode DateTime Addminutes (Nilai Ganda) AddTicks(long value)              
AddYears             Metode         datetime AddYears(int value)             
CompareTo            Metode         int CompareTo(System.Object value), int ...

Anda dapat dengan cepat melihat bahwa objek DateTime memiliki AddDays yang dapat Anda gunakan dengan cepat untuk mendapatkan kencan kemarin:

> (Dapatkan-Tanggal).AddDays(-1) 

Sabtu, 20 Januari 2018 20:24:42

Untuk melakukan sesuatu yang sedikit lebih menarik, hubungi layanan cuaca Yahoo (karena tidak memerlukan token API) dan dapatkan cuaca lokal Anda.

$city="Boston"
$state="MA"
$url="https://query.yahooapis.com/v1/public/yql?q=select%20*% 20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22${city}%2C%20${state}%22)&format =json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"

Sekarang, kita bisa melakukan hal-hal dengan cara kuno dan menjalankan curl $url untuk mendapatkan gumpalan raksasa JSON, atau...

$weather=(Invoke-RestMethod $url)  

Jika Anda melihat jenis $weather (dengan menjalankan echo $weather.GetType().FullName ), Anda akan melihat bahwa itu adalah PSCustomObject . Ini adalah objek dinamis yang mencerminkan struktur JSON.

Dan PowerShell akan senang membantu Anda menavigasinya dengan penyelesaian tabnya. Cukup ketik $weather. (pastikan untuk menyertakan ".") dan tekan Tab. Anda akan melihat semua kunci JSON tingkat akar. Ketik satu, diikuti dengan ". ", tekan Tab lagi, dan Anda akan melihat turunannya (jika ada).

Dengan demikian, Anda dapat dengan mudah menavigasi ke data yang Anda inginkan:

> echo $ weather.query.results.channel.atmosphere.pressure 
1019.0
> echo $ weather.query.results.chill.
41

Dan jika Anda memiliki JSON atau CSV (atau dikembalikan oleh perintah luar) sebagai data tidak terstruktur, cukup masukkan ke ConvertFrom-Json atau ConvertFrom-CSV cmdlet, masing-masing, dan Anda dapat memiliki data Anda di objek bersih yang bagus.

Komputasi vs. otomatisasi

Kami menggunakan cangkang untuk dua tujuan. Salah satunya adalah untuk komputasi, untuk menjalankan perintah individu dan secara manual menanggapi output mereka. Yang lainnya adalah otomatisasi, untuk menulis skrip yang menjalankan banyak perintah dan merespons outputnya secara terprogram.

Masalah yang sebagian besar dari kita telah pelajari untuk diabaikan adalah bahwa kedua tujuan ini menempatkan persyaratan yang berbeda dan saling bertentangan pada shell. Komputasi membutuhkan shell menjadi singkat. Semakin sedikit penekanan tombol yang dapat dilakukan pengguna, semakin baik. Tidak penting jika apa yang diketik pengguna hampir tidak dapat dibaca oleh orang lain. Script, di sisi lain, adalah kode. Keterbacaan dan pemeliharaan adalah kuncinya. Dan di sini, utilitas POSIX sering mengecewakan kita. Sementara beberapa perintah memang menawarkan sintaks yang singkat dan dapat dibaca (mis. -f dan --force ) untuk beberapa parameternya, perintah tersebut menamakan dirinya err di sisi singkatnya, bukan keterbacaan.

PowerShell menyertakan beberapa mekanisme untuk menghilangkan kompromi Faustian itu.

Pertama, penyelesaian tab menghilangkan pengetikan nama argumen. Misalnya, ketik Get-Random -Mi , tekan Tab dan PowerShell akan menyelesaikan argumen untuk Anda:Get-Random -Minimum . Tetapi jika Anda benar-benar ingin menjadi singkat, Anda bahkan tidak perlu menekan Tab. Misalnya, PowerShell akan mengerti

Get-Random -Mi 1 -Ma 10 

karena Mi dan Ma masing-masing memiliki penyelesaian yang unik.

Anda mungkin telah memperhatikan bahwa semua nama cmdlet PowerShell memiliki struktur kata kerja-kata benda. Ini dapat membantu pembacaan skrip, tetapi Anda mungkin tidak ingin terus mengetik Get- berulang-ulang di baris perintah. Jadi jangan! Jika Anda mengetik kata benda tanpa kata kerja, PowerShell akan mencari Get- perintah dengan kata benda itu.

Perhatian:meskipun PowerShell tidak peka huruf besar/kecil, merupakan praktik yang baik untuk menggunakan huruf kapital pada huruf pertama kata benda saat Anda bermaksud menggunakan perintah PowerShell. Misalnya, mengetik date akan memanggil date sistem Anda kegunaan. Mengetik Date akan memanggil Get-Date Power PowerShell cmdlet.

Dan jika itu tidak cukup, PowerShell memiliki alias untuk membuat nama sederhana. Misalnya, jika Anda mengetik alias -name cd , Anda akan menemukan cd perintah di PowerShell itu sendiri merupakan alias untuk Set-Location perintah.

Jadi untuk meninjau—Anda mendapatkan penyelesaian tab yang kuat, alias, dan penyelesaian kata benda untuk menjaga nama perintah Anda singkat, otomatis dan konsisten pemotongan nama parameter, sambil tetap menikmati sintaks yang kaya dan mudah dibaca untuk skrip.

Jadi... teman?

Hanya ada beberapa keuntungan dari PowerShell. Masih banyak fitur dan cmdlet yang belum saya bahas (lihat Where-Object atau alias ? jika Anda ingin membuat grep menangis). Dan hei, jika Anda benar-benar rindu kampung halaman, PowerShell akan dengan senang hati meluncurkan utilitas asli lama Anda untuk Anda. Tetapi beri diri Anda cukup waktu untuk menyesuaikan diri di dunia cmdlet berorientasi objek PowerShell, dan Anda mungkin menemukan diri Anda memilih untuk melupakan jalan kembali.


Linux
  1. Inti Dari Perintah Eksternal `cd`?

  2. Riwayat Arsip Tanpa Keluar dari Shell?

  3. Cara Mengubah Shell Default Di Linux

  1. Lakukan matematika di shell Linux dengan GNU bc

  2. Menyesuaikan shell Bash

  3. Apa shell default Busybox?

  1. Diutamakan Operator Logika Shell &&, ||?

  2. Memahami Arti `$_`?

  3. Arti dari $? Dalam Skrip Shell?