GNU/Linux >> Linux Esercitazione >  >> Linux

Potenza (Shell) alle persone

All'inizio di quest'anno, PowerShell Core è diventato generalmente disponibile con una licenza Open Source (MIT). PowerShell non è certo una nuova tecnologia. Dalla sua prima versione per Windows nel 2006, i creatori di PowerShell hanno cercato di incorporare la potenza e la flessibilità delle shell Unix rimediando alle loro carenze percepite, in particolare la necessità di manipolare il testo per trarre valore dalla combinazione di comandi.

Cinque versioni principali dopo, PowerShell Core consente allo stesso ambiente di comando e shell innovativo di essere eseguito in modo nativo su tutti i principali sistemi operativi, inclusi OS X e Linux. Alcuni (leggi:quasi tutti ) può ancora deridere l'audacia e/o la temerarietà di questo intruso nato da Windows nell'offrirsi a piattaforme che hanno ambienti shell forti da tempo immemorabile (almeno come definito da un millennial). In questo post, spero di dimostrare che PowerShell può fornire vantaggi anche agli utenti esperti.

Coerenza tra piattaforme

Se prevedi di trasferire i tuoi script da un ambiente di esecuzione a un altro, devi assicurarti di utilizzare solo i comandi e le sintassi che funzionano. Ad esempio, sui sistemi GNU, otterresti la data di ieri come segue:

date --date="1 day ago" 

Sui sistemi BSD (come OS X), la sintassi di cui sopra non funzionerebbe, poiché l'utilità della data BSD richiede la seguente sintassi:

date -v -1d 

Poiché PowerShell è concesso in licenza con una licenza permissiva e creato per tutte le piattaforme, puoi spedirlo con la tua applicazione. Pertanto, quando i tuoi script vengono eseguiti nell'ambiente di destinazione, verranno eseguiti sulla stessa shell utilizzando le stesse implementazioni di comandi dell'ambiente in cui hai testato i tuoi script.

Oggetti e dati strutturati

*I comandi e le utilità nix si basano sulla tua capacità di consumare e manipolare dati non strutturati. Quelli che hanno convissuto per anni con sed grep e awk potrebbe non essere disturbato da questa affermazione, ma c'è un modo migliore.

Ripeti l'esempio della data di ieri in PowerShell. Per ottenere la data corrente, esegui Get-Date cmdlet (pronunciato "comando"):

> Get-Date                         

domenica 21 gennaio 2018 20:12:41

L'output che vedi non è in realtà una stringa di testo. Piuttosto, è una rappresentazione di stringa di un oggetto .Net Core. Proprio come qualsiasi altro oggetto in qualsiasi altro ambiente OOP, ha un tipo e, molto spesso, metodi che puoi chiamare.

Dimostriamo questo:

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

Il $(...) la sintassi si comporta esattamente come ci si aspetterebbe dalle shell POSIX:il risultato della valutazione del comando tra parentesi viene sostituito per l'intera espressione. In PowerShell, tuttavia, $ è strettamente facoltativo in tali espressioni. E, soprattutto, il risultato è un oggetto .Net, non testo. Quindi possiamo chiamare GetType() metodo su quell'oggetto per ottenere il suo tipo di oggetto (simile a Class oggetto in Java) e il FullName per ottenere il nome completo del tipo.

Quindi, in che modo questo orientamento agli oggetti ti semplifica la vita?

Per prima cosa, puoi reindirizzare qualsiasi oggetto a Get-Member cmdlet per vedere tutti i metodi e le proprietà che ha da offrire.

> (Ottieni-data) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | Get-Member        


   TypeName:System.DateTime

Name                 MemberType     Definition                                
----                      --- - ---------
Aggiungi metodo DateTime Add (TimeSpan Valore)
ADD AGGGIORDADY METODO METODO DATETUME ADD AGGGIUNGI GIORNI (doppio valore)
Addhours Method Metodo DateTime Addhours (doppio valore)
AddMillisconds Metodo DateTime AddMillliseconds (doppio valore)
Addminutes Method Metodo AddMinutes (doppio valore)
Addmonths Method DateTime Addmonths (INT mesi)
AddSeconds Method Metodo DateTime AddSeconds (doppio valore)
Addicks Metodo Metodo AddTicks(valore lungo)              
AddYears             Metodo         datetime AddYears(valore int)             
CompareTo            Method         int CompareTo(System.Object value), int ...

Puoi vedere rapidamente che l'oggetto DateTime ha un AddDays che puoi utilizzare rapidamente per ottenere la data di ieri:

> (Get-Date).AddDays(-1) 

Sabato 20 gennaio 2018 20:24:42

Per fare qualcosa di leggermente più eccitante, chiamiamo il servizio meteo di Yahoo (perché non richiede un token API) e otteniamo il meteo locale.

$city="Boston"
$state="MA"
$url="https://query.yahooapis.com/v1/public/yql?q=select%20*% 20da%20weather.forecast%20dove%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"

Ora, potremmo fare le cose alla vecchia maniera ed eseguire semplicemente curl $url per ottenere un blob gigante di JSON, oppure...

$weather=(Invoke-RestMethod $url)  

Se guardi il tipo di $weather (eseguendo echo $weather.GetType().FullName ), vedrai che è un PSCustomObject . È un oggetto dinamico che riflette la struttura del JSON.

E PowerShell sarà entusiasta di aiutarti a navigare attraverso il completamento della scheda. Digita semplicemente $weather. (assicurandosi di includere il ".") e premere Tab. Vedrai tutte le chiavi JSON a livello di root. Digita uno, seguito da un ". ", premi di nuovo Tab e vedrai i suoi figli (se presenti).

Pertanto, puoi facilmente navigare verso i dati che desideri:

> ECHO $ ​​Meteo.Query.results.channel.atmosphere.pressure 
1019.0

> ECHO $ ​​Meteo.Query.results.channel.wind.chill
41

E se hai JSON o CSV in giro (o restituito da un comando esterno) come dati non strutturati, invialo semplicemente a ConvertFrom-Json o ConvertFrom-CSV cmdlet, rispettivamente, e puoi avere i tuoi dati in oggetti puliti e piacevoli.

Informatica vs. automazione

Usiamo le conchiglie per due scopi. Uno è per l'informatica, per eseguire singoli comandi e per rispondere manualmente al loro output. L'altro è l'automazione, per scrivere script che eseguono più comandi e rispondono al loro output in modo programmatico.

Un problema che la maggior parte di noi ha imparato a ignorare è che questi due scopi impongono requisiti diversi e contrastanti sulla shell. L'informatica richiede che la shell sia laconica. Meno sequenze di tasti un utente può farla franca, meglio è. Non è importante se ciò che l'utente ha digitato è appena leggibile per un altro essere umano. Gli script, d'altra parte, sono codice. Leggibilità e manutenibilità sono fondamentali. E qui, le utility POSIX spesso ci deludono. Mentre alcuni comandi offrono sintassi sia laconiche che leggibili (ad es. -f e --force ) per alcuni dei loro parametri, i nomi dei comandi stessi sono un errore di brevità, non di leggibilità.

PowerShell include diversi meccanismi per eliminare quel compromesso faustiano.

Innanzitutto, il completamento della scheda elimina la digitazione dei nomi degli argomenti. Ad esempio, digita Get-Random -Mi , premi Tab e PowerShell completerà l'argomento per te:Get-Random -Minimum . Ma se vuoi davvero essere laconico, non hai nemmeno bisogno di premere Tab. Ad esempio, PowerShell capirà

Get-Random -Mi 1 -Ma 10 

perché Mi e Ma ognuno ha completamenti unici.

Potresti aver notato che tutti i nomi dei cmdlet di PowerShell hanno una struttura verbo-nome. Questo può aiutare la leggibilità dello script, ma probabilmente non vuoi continuare a digitare Get- più e più volte nella riga di comando. Quindi non farlo! Se digiti un nome senza verbo, PowerShell cercherà un Get- comando con quel sostantivo.

Attenzione:sebbene PowerShell non faccia distinzione tra maiuscole e minuscole, è buona norma mettere in maiuscolo la prima lettera del sostantivo quando si intende utilizzare un comando PowerShell. Ad esempio, digitando date chiamerà la date del tuo sistema utilità. Digitando Date chiamerà Get-Date di PowerShell cmdlet.

E se ciò non bastasse, PowerShell ha alias per creare nomi semplici. Ad esempio, se digiti alias -name cd , scoprirai il cd Il comando in PowerShell è esso stesso un alias per Set-Location comando.

Quindi, per rivedere, ottieni un potente completamento delle schede, alias e completamenti dei nomi per mantenere i nomi dei comandi brevi, automatici e coerenti troncamento del nome del parametro, pur godendo di una sintassi ricca e leggibile per lo scripting.

Allora... amici?

Ci sono solo alcuni dei vantaggi di PowerShell. Ci sono altre funzionalità e cmdlet che non ho discusso (consulta Where-Object o il suo alias ? se vuoi fare grep gridare). E hey, se hai davvero nostalgia di casa, PowerShell sarà felice di lanciare le tue vecchie utility native per te. Ma concediti abbastanza tempo per acclimatarti al mondo dei cmdlet orientati agli oggetti di PowerShell e potresti ritrovarti a scegliere di dimenticare la via del ritorno.


Linux
  1. Personalizzazione della shell Bash

  2. Precedenza degli operatori logici della shell &&, ||?

  3. Capisci il significato di `$_`?

  4. Cronologia dell'archivio senza uscire dalla shell?

  5. Il significato di $? In uno script di shell?

Introduzione all'utility goto shell di Linux

Che cos'è la shell in Linux?

Come modificare la shell predefinita nel sistema Linux

Comprendere il ciclo for negli script della shell

Il ciclo while negli script della shell

Qual è la shell predefinita di Busybox?