GNU/Linux >> Tutoriales Linux >  >> Linux

Poder (Shell) para la gente

A principios de este año, PowerShell Core estuvo disponible de forma general bajo una licencia de código abierto (MIT). PowerShell no es una tecnología nueva. Desde su primer lanzamiento para Windows en 2006, los creadores de PowerShell buscaron incorporar el poder y la flexibilidad de los shells de Unix mientras remediaban sus deficiencias percibidas, particularmente la necesidad de manipulación de texto para obtener valor de la combinación de comandos.

Cinco lanzamientos importantes más tarde, PowerShell Core permite que el mismo entorno innovador de shell y comando se ejecute de forma nativa en todos los principales sistemas operativos, incluidos OS X y Linux. Algunos (léase:casi todos ) aún puede burlarse de la audacia y/o la temeridad de este intruso nacido en Windows para ofrecerse a plataformas que han tenido entornos de shell fuertes desde tiempos inmemoriales (al menos como lo define un millennial). En esta publicación, espero demostrar que PowerShell puede brindar ventajas incluso a los usuarios experimentados.

Coherencia entre plataformas

Si planea migrar sus scripts de un entorno de ejecución a otro, debe asegurarse de usar solo los comandos y sintaxis que funcionan. Por ejemplo, en los sistemas GNU, obtendría la fecha de ayer de la siguiente manera:

date --date="1 day ago"

En sistemas BSD (como OS X), la sintaxis anterior no funcionaría, ya que la utilidad de fecha BSD requiere la siguiente sintaxis:

date -v -1d

Debido a que PowerShell tiene una licencia permisiva y está diseñado para todas las plataformas, puede enviarlo con su aplicación. Por lo tanto, cuando sus secuencias de comandos se ejecuten en el entorno de destino, se ejecutarán en el mismo shell utilizando las mismas implementaciones de comandos que el entorno en el que probó sus secuencias de comandos.

Objetos y datos estructurados

*Los comandos y las utilidades nix se basan en su capacidad para consumir y manipular datos no estructurados. Aquellos que han vivido durante años con sed grep y awk Puede que esta declaración no le moleste, pero hay una mejor manera.

Rehagamos el ejemplo de la fecha de ayer en PowerShell. Para obtener la fecha actual, ejecute Get-Date cmdlet (pronunciado "commandlet"):

> Get-Date                         

Sunday, January 21, 2018 8:12:41 PM

El resultado que ve no es realmente una cadena de texto. Más bien, es una representación de cadena de un objeto .Net Core. Al igual que cualquier otro objeto en cualquier otro entorno de programación orientada a objetos, tiene un tipo y, en la mayoría de los casos, métodos a los que puede llamar.

Probemos esto:

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

El $(...) la sintaxis se comporta exactamente como cabría esperar de los shells POSIX:el resultado de la evaluación del comando entre paréntesis se sustituye por la expresión completa. En PowerShell, sin embargo, $ es estrictamente opcional en tales expresiones. Y, lo más importante, el resultado es un objeto .Net, no texto. Entonces podemos llamar al GetType() en ese objeto para obtener su tipo de objeto (similar a Class objeto en Java), y el FullName propiedad para obtener el nombre completo del tipo.

Entonces, ¿cómo esta orientación a objetos hace tu vida más fácil?

Primero, puede canalizar cualquier objeto al Get-Member cmdlet para ver todos los métodos y propiedades que tiene para ofrecer.

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


   TypeName: System.DateTime

Name                 MemberType     Definition                                
----                 ----------     ----------                                
Add                  Method         datetime Add(timespan value)              
AddDays              Method         datetime AddDays(double value)            
AddHours             Method         datetime AddHours(double value)            
AddMilliseconds      Method         datetime AddMilliseconds(double value)    
AddMinutes           Method         datetime AddMinutes(double value)          
AddMonths            Method         datetime AddMonths(int months)            
AddSeconds           Method         datetime AddSeconds(double value)          
AddTicks             Method         datetime AddTicks(long value)              
AddYears             Method         datetime AddYears(int value)              
CompareTo            Method         int CompareTo(System.Object value), int ...

Puede ver rápidamente que el objeto DateTime tiene un AddDays que puede usar rápidamente para obtener la fecha de ayer:

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

Saturday, January 20, 2018 8:24:42 PM

Para hacer algo un poco más emocionante, llamemos al servicio meteorológico de Yahoo (porque no requiere un token API) y obtengamos el clima local.

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

Ahora, podríamos hacer las cosas a la antigua y simplemente ejecutar curl $url para obtener una gota gigante de JSON, o...

$weather=(Invoke-RestMethod $url) 

Si miras el tipo de $weather (ejecutando echo $weather.GetType().FullName ), verá que es un PSCustomObject . Es un objeto dinámico que refleja la estructura del JSON.

Y PowerShell estará encantado de ayudarlo a navegar por él con su pestaña para completar. Simplemente escriba $weather. (asegurándose de incluir el ".") y presione Tabulador. Verá todas las claves JSON de nivel raíz. Escriba uno, seguido de un ". ", presiona Tab de nuevo y verás sus elementos secundarios (si los hay).

Por lo tanto, puede navegar fácilmente a los datos que desee:

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

> echo $weather.query.results.channel.wind.chill                                                                      
41

Y si tiene JSON o CSV por ahí (o devuelto por un comando externo) como datos no estructurados, simplemente canalícelos a ConvertFrom-Json o ConvertFrom-CSV cmdlet, respectivamente, y puede tener sus datos en objetos agradables y limpios.

Informática versus automatización

Usamos conchas para dos propósitos. Uno es para computación, para ejecutar comandos individuales y responder manualmente a su salida. El otro es la automatización, para escribir secuencias de comandos que ejecutan varios comandos y responden a su salida mediante programación.

Un problema que la mayoría de nosotros hemos aprendido a pasar por alto es que estos dos propósitos imponen requisitos diferentes y contradictorios al caparazón. La informática requiere que el caparazón sea lacónico. Cuantas menos pulsaciones de teclas pueda hacer un usuario, mejor. No es importante si lo que el usuario ha escrito es apenas legible para otro ser humano. Los scripts, por otro lado, son código. La legibilidad y la mantenibilidad son clave. Y aquí, las utilidades POSIX a menudo nos fallan. Si bien algunos comandos ofrecen sintaxis lacónica y legible (por ejemplo, -f y --force ) para algunos de sus parámetros, los nombres de los comandos se equivocan por el lado de la brevedad, no de la legibilidad.

PowerShell incluye varios mecanismos para eliminar esa compensación faustiana.

En primer lugar, la finalización con tabuladores elimina la escritura de nombres de argumentos. Por ejemplo, escriba Get-Random -Mi , presione Tabulador y PowerShell completará el argumento por usted:Get-Random -Minimum . Pero si realmente quieres ser lacónico, ni siquiera necesitas presionar Tabulador. Por ejemplo, PowerShell entenderá

Get-Random -Mi 1 -Ma 10

porque Mi y Ma cada uno tiene terminaciones únicas.

Es posible que haya notado que todos los nombres de cmdlet de PowerShell tienen una estructura de verbo-sustantivo. Esto puede ayudar a la legibilidad del script, pero probablemente no quiera seguir escribiendo Get- una y otra vez en la línea de comando. ¡Así que no! Si escribe un sustantivo sin verbo, PowerShell buscará un Get- comando con ese sustantivo.

Precaución:aunque PowerShell no distingue entre mayúsculas y minúsculas, es una buena práctica escribir en mayúscula la primera letra del sustantivo cuando pretenda usar un comando de PowerShell. Por ejemplo, escribiendo date llamará a la date de su sistema utilidad. Escribiendo Date llamará a Get-Date de PowerShell cmdlet.

Y si eso no es suficiente, PowerShell tiene alias para crear nombres simples. Por ejemplo, si escribe alias -name cd , descubrirás el cd El comando en PowerShell es en sí mismo un alias para Set-Location comando.

Entonces, para repasar:obtiene un potente completado de pestañas, alias y sustantivos para mantener los nombres de sus comandos breves, automáticos y coherentes. truncamiento del nombre del parámetro, sin dejar de disfrutar de una sintaxis rica y legible para secuencias de comandos.

Entonces... ¿amigos?

Estas son solo algunas de las ventajas de PowerShell. Hay más funciones y cmdlets de los que no he hablado (consulte Where-Object o su alias ? si quieres hacer grep llorar). Y oye, si realmente sientes nostalgia, PowerShell estará encantado de lanzar tus antiguas utilidades nativas por ti. Pero tómese el tiempo suficiente para aclimatarse al mundo de los cmdlets orientados a objetos de PowerShell y es posible que decida olvidar el camino de regreso.


Linux
  1. Sume una columna de números en el shell de Unix

  2. adb:Encuentra PID desde el shell de adb

  3. Inicio de un shell en el contenedor Docker Alpine

  4. Codificación a base32 desde el shell

  5. ¿Cuál es el shell predeterminado de Busybox?

Introducción a la utilidad goto shell de Linux

¿Qué es el Shell en Linux?

Cómo cambiar el shell predeterminado en el sistema Linux

Comprender el bucle for en los scripts de Shell

El bucle while en los scripts de Shell

Cómo cambiar el shell predeterminado en Linux