GNU/Linux >> Tutoriels Linux >  >> Linux

Pouvoir au peuple

Plus tôt cette année, PowerShell Core est devenu généralement disponible sous une licence Open Source (MIT). PowerShell n'est pas une nouvelle technologie. Depuis sa première version pour Windows en 2006, les créateurs de PowerShell ont cherché à incorporer la puissance et la flexibilité des shells Unix tout en remédiant à leurs lacunes perçues, en particulier le besoin de manipulation de texte pour tirer parti de la combinaison de commandes.

Cinq versions majeures plus tard, PowerShell Core permet au même environnement innovant de shell et de commande de s'exécuter de manière native sur tous les principaux systèmes d'exploitation, y compris OS X et Linux. Certains (lire :presque tout le monde ) peut encore se moquer de l'audace et/ou de la témérité de cet intrus né de Windows pour s'offrir à des plates-formes qui ont eu des environnements shell solides depuis des temps immémoriaux (au moins tel que défini par un millénaire). Dans cet article, j'espère démontrer que PowerShell peut offrir des avantages même aux utilisateurs chevronnés.

Cohérence entre les plates-formes

Si vous envisagez de porter vos scripts d'un environnement d'exécution à un autre, vous devez vous assurer que vous n'utilisez que les commandes et les syntaxes qui fonctionnent. Par exemple, sur les systèmes GNU, vous obtiendriez la date d'hier comme suit :

date --date="1 day ago" 

Sur les systèmes BSD (tels que OS X), la syntaxe ci-dessus ne fonctionnerait pas, car l'utilitaire de date BSD nécessite la syntaxe suivante :

date -v -1d 

Étant donné que PowerShell est concédé sous une licence permissive et conçu pour toutes les plates-formes, vous pouvez l'expédier avec votre application. Ainsi, lorsque vos scripts s'exécutent dans l'environnement cible, ils s'exécutent sur le même shell en utilisant les mêmes implémentations de commande que l'environnement dans lequel vous avez testé vos scripts.

Objets et données structurées

Les commandes et utilitaires *nix dépendent de votre capacité à consommer et à manipuler des données non structurées. Ceux qui vivent depuis des années avec sed grep et awk peut être indifférent à cette déclaration, mais il existe un meilleur moyen.

Reprenons l'exemple de la date d'hier dans PowerShell. Pour obtenir la date actuelle, exécutez le Get-Date applet de commande (prononcé "commandlet") :

> Get-Date                         

Dimanche 21 janvier 2018 20:12:41

La sortie que vous voyez n'est pas vraiment une chaîne de texte. Il s'agit plutôt d'une représentation sous forme de chaîne d'un objet .Net Core. Comme tout autre objet dans n'importe quel autre environnement POO, il a un type et le plus souvent, des méthodes que vous pouvez appeler.

Prouvons ceci :

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

Le $(...) La syntaxe se comporte exactement comme on s'y attendrait des shells POSIX - le résultat de l'évaluation de la commande entre parenthèses est remplacé par l'expression entière. Dans PowerShell, cependant, $ est strictement facultatif dans de telles expressions. Et, plus important encore, le résultat est un objet .Net, pas du texte. Nous pouvons donc appeler le GetType() méthode sur cet objet pour obtenir son objet de type (similaire à Class objet en Java), et le FullName propriété pour obtenir le nom complet du type.

Alors, comment cette orientation objet vous facilite-t-elle la vie ?

Tout d'abord, vous pouvez diriger n'importe quel objet vers le Get-Member applet de commande pour voir toutes les méthodes et propriétés qu'elle a à offrir.

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


   TypeName :System.DateTime

Name                 MemberType     Definition                                
----                 ----------     - ----------
Ajoutez la méthode DateTime Ajouter (Timespan Valeur)
Méthode Adddays DateTime Adddays (Valeur double)
Méthode AddHours DateTime AddHours (Valeur double)
AddMillisecondes Méthode DateTime AddMillisecondes (Valeur double)
Méthode Addminutes DateTime Addminutes (Valeur double)
Méthode AddMonths DateTime AddMonths (int mois)
Méthode AddSeconds DateTime AddSeconds (Valeur double)
Méthode AddTicks Datetime AddTicks(long value)              
AddYears             Method         datetime AddYears(int value)             
Méthode CompareTo            Méthode         int CompareTo(System.Object value), int ...

Vous pouvez rapidement voir que l'objet DateTime a un AddDays que vous pouvez rapidement utiliser pour obtenir la date d'hier :

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

Samedi 20 janvier 2018 20:24:42

Pour faire quelque chose d'un peu plus excitant, appelons le service météo de Yahoo (car il ne nécessite pas de jeton API) et obtenons votre météo locale.

$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"

Maintenant, nous pourrions faire les choses à l'ancienne et simplement lancer curl $url pour obtenir un blob géant de JSON, ou...

$weather=(Invoke-RestMethod $url)  

Si vous regardez le type de $weather (en exécutant echo $weather.GetType().FullName ), vous verrez qu'il s'agit d'un PSCustomObject . C'est un objet dynamique qui reflète la structure du JSON.

Et PowerShell sera ravi de vous aider à le parcourir avec son achèvement d'onglet. Tapez simplement $weather. (en veillant à inclure le ".") et appuyez sur Tab. Vous verrez toutes les clés JSON de niveau racine. Tapez-en un, suivi d'un ". ", appuyez à nouveau sur Tab, et vous verrez ses enfants (le cas échéant).

Ainsi, vous pouvez facilement naviguer vers les données souhaitées :

> ECHO $ ​​Météo.Query.Results.Channel.Atmosphère.Pressure 
1019.0

> Echo $ Météo.Query.Results.Channel.wind.chill
41

Et si vous avez JSON ou CSV qui traînent (ou sont renvoyés par une commande extérieure) en tant que données non structurées, dirigez-les simplement dans le ConvertFrom-Json ou ConvertFrom-CSV cmdlet, respectivement, et vous pouvez avoir vos données dans de beaux objets propres.

Informatique contre automatisation

Nous utilisons des coquilles à deux fins. L'un est pour l'informatique, pour exécuter des commandes individuelles et pour répondre manuellement à leur sortie. L'autre est l'automatisation, pour écrire des scripts qui exécutent plusieurs commandes et répondent à leur sortie par programmation.

Un problème que la plupart d'entre nous ont appris à ignorer est que ces deux objectifs imposent des exigences différentes et contradictoires au shell. L'informatique nécessite que le shell soit laconique. Moins un utilisateur peut utiliser de touches, mieux c'est. Peu importe si ce que l'utilisateur a tapé est à peine lisible pour un autre être humain. Les scripts, en revanche, sont du code. La lisibilité et la maintenabilité sont essentielles. Et ici, les utilitaires POSIX nous échouent souvent. Bien que certaines commandes offrent à la fois des syntaxes laconiques et lisibles (par exemple, -f et --force ) pour certains de leurs paramètres, les noms de commande eux-mêmes privilégient la brièveté et non la lisibilité.

PowerShell inclut plusieurs mécanismes pour éliminer ce compromis faustien.

Tout d'abord, la complétion par tabulation élimine la saisie des noms d'arguments. Par exemple, tapez Get-Random -Mi , appuyez sur Tab et PowerShell complétera l'argument pour vous :Get-Random -Minimum . Mais si vous voulez vraiment être laconique, vous n'avez même pas besoin d'appuyer sur Tab. Par exemple, PowerShell comprendra

Get-Random -Mi 1 -Ma 10 

parce que Mi et Ma chacun a des complétions uniques.

Vous avez peut-être remarqué que tous les noms d'applet de commande PowerShell ont une structure verbe-nom. Cela peut améliorer la lisibilité du script, mais vous ne voulez probablement pas continuer à taper Get- encore et encore dans la ligne de commande. Alors non ! Si vous tapez un nom sans verbe, PowerShell recherchera un Get- commande avec ce nom.

Attention :bien que PowerShell ne soit pas sensible à la casse, il est recommandé de mettre en majuscule la première lettre du nom lorsque vous avez l'intention d'utiliser une commande PowerShell. Par exemple, en tapant date appellera la date de votre système utilitaire. Taper Date appellera Get-Date de PowerShell applet de commande.

Et si cela ne suffit pas, PowerShell dispose d'alias pour créer des noms simples. Par exemple, si vous saisissez alias -name cd , vous découvrirez le cd La commande dans PowerShell est elle-même un alias pour le Set-Location commande.

Donc, pour passer en revue, vous bénéficiez d'une complétion de tabulation puissante, d'alias et de complétions de noms pour garder vos noms de commande courts, automatiques et cohérents la troncature des noms de paramètres, tout en bénéficiant d'une syntaxe riche et lisible pour les scripts.

Alors... les amis ?

Il n'y a que quelques-uns des avantages de PowerShell. Il y a plus de fonctionnalités et d'applets de commande dont je n'ai pas parlé (consultez Where-Object ou son alias ? si vous voulez faire grep pleurer). Et bon, si vous avez vraiment le mal du pays, PowerShell se fera un plaisir de lancer vos anciens utilitaires natifs pour vous. Mais donnez-vous suffisamment de temps pour vous acclimater au monde des applets de commande orientées objet de PowerShell, et vous risquez de choisir d'oublier le chemin du retour.


Linux
  1. Faites des calculs dans le shell Linux avec GNU bc

  2. Alias ​​de ligne de commande dans le shell Linux

  3. Personnalisation du shell Bash

  4. Priorité des opérateurs logiques Shell &&, ||?

  5. Comprendre la signification de `$_` ?

Introduction à l'utilitaire Linux goto shell

Qu'est-ce que le Shell sous Linux ?

Comment changer le shell par défaut dans le système Linux

Comprendre la boucle for dans les scripts shell

La boucle while dans les scripts shell

Quel est le shell par défaut de Busybox ?