GNU/Linux >> Znalost Linux >  >> Linux

Moc (Shell) lidem

Začátkem tohoto roku se PowerShell Core stal obecně dostupným pod licencí Open Source (MIT). PowerShell je stěží nová technologie. Od prvního vydání pro Windows v roce 2006 se tvůrci PowerShellu snažili začlenit výkon a flexibilitu unixových shellů a zároveň napravit jejich vnímané nedostatky, zejména potřebu manipulace s textem k odvození hodnoty z kombinování příkazů.

O pět hlavních verzí později umožňuje PowerShell Core stejné inovativní prostředí shellu a příkazů nativně běžet na všech hlavních operačních systémech, včetně OS X a Linuxu. Někteří (čti:téměř všichni ) se stále může posmívat drzosti a/nebo drzosti tohoto vetřelce narozeného ve Windows, aby se nabídl platformám, které mají od nepaměti silná prostředí shellu (alespoň tak, jak je definováno tisíciletí). V tomto příspěvku doufám, že dokáži, že PowerShell může poskytnout výhody i zkušeným uživatelům.

Konzistence napříč platformami

Pokud plánujete přenést své skripty z jednoho spouštěcího prostředí do jiného, ​​musíte se ujistit, že používáte pouze příkazy a syntaxe, které fungují. Například na systémech GNU byste včerejší datum získali následovně:

date --date="1 day ago" 

Na systémech BSD (jako je OS X) by výše uvedená syntaxe nefungovala, protože nástroj BSD date vyžaduje následující syntaxi:

date -v -1d 

Vzhledem k tomu, že PowerShell je licencován na základě permisivní licence a je vytvořen pro všechny platformy, můžete jej dodávat s aplikací. Když se tedy vaše skripty spouštějí v cílovém prostředí, poběží ve stejném prostředí pomocí stejných implementací příkazů jako prostředí, ve kterém jste své skripty testovali.

Objekty a strukturovaná data

*Příkazy a nástroje nix spoléhají na vaši schopnost spotřebovávat a manipulovat s nestrukturovanými daty. Ti, kteří žili roky s sed grep a awk může být toto prohlášení neobtěžováno, ale existuje lepší způsob.

Zopakujme si příklad včerejšího data v PowerShellu. Chcete-li získat aktuální datum, spusťte Get-Date cmdlet (vyslovujte "příkaz"):

> Get-Date                         

Neděle, 21. ledna 2018 20:12:41

Výstup, který vidíte, není ve skutečnosti řetězec textu. Spíše se jedná o řetězcovou reprezentaci objektu .Net Core. Stejně jako jakýkoli jiný objekt v jakémkoli jiném prostředí OOP má typ a nejčastěji metody, které můžete volat.

Pojďme to dokázat:

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

$(...) syntaxe se chová přesně tak, jak byste očekávali od shellů POSIX – výsledek vyhodnocení příkazu v závorkách je nahrazen celým výrazem. V PowerShellu je však $ v těchto výrazech přísně volitelný. A co je nejdůležitější, výsledkem je objekt .Net, nikoli text. Můžeme tedy zavolat GetType() metoda na tomto objektu k získání jeho typu objektu (podobně jako Class objekt v Javě) a FullName vlastnost, abyste získali úplný název typu.

Jak vám tedy tato objektově orientovaná orientace usnadňuje život?

Nejprve můžete do Get-Member převést libovolný objekt cmdlet, abyste viděli všechny metody a vlastnosti, které nabízí.

> (Získat datum) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | GET-Člen


TypeName:System.DateTime

Jméno Memnspe Definice
---- ---------- - ---------
Přidat metodu DateTime Add (Timespan Hodnota)
Doplňky Metoda DateTime Doplňky (Dvojitá hodnota)
Addhours Metoda DateTime Addhours (Dvojitá hodnota)
AddMillisConds Metoda DateTime AddMillisConds (Dvojitá hodnota)
Doplňky Metoda DateTime AddMinutes (Dvouhodová hodnota)
ADDMENTHS Metoda DateTime AddMonths (int měsíce)
AddSeconds Metoda DateTime AddSeconds (Dvojitá hodnota)
Addticks Metoda DateTime AddTicks (long value)              
AddYears             Metoda         datetime AddYears (int value)             
CompareTo            Metoda         int CompareTo(System.Object value), int ...

Rychle uvidíte, že objekt DateTime má AddDays které můžete rychle použít k získání včerejšího data:

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

Sobota, 20. ledna 2018 20:24:42

Chcete-li udělat něco trochu zajímavějšího, zavolejte meteorologickou službu Yahoo (protože nevyžaduje token API) a zjistěte místní počasí.

$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)&formát =json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"

Nyní bychom mohli dělat věci staromódním způsobem a jednoduše spustit curl $url získat obří blob JSON, nebo...

$weather=(Invoke-RestMethod $url)  

Pokud se podíváte na typ $weather (spuštěním echo $weather.GetType().FullName ), uvidíte, že se jedná o PSCustomObject . Je to dynamický objekt, který odráží strukturu JSON.

A PowerShell bude nadšený, že vám pomůže se v něm orientovat pomocí vyplňování karet. Stačí zadat $weather. (nezapomeňte zahrnout ".") a stiskněte Tab. Uvidíte všechny klíče JSON na kořenové úrovni. Zadejte jeden a za ním „. “, znovu stiskněte Tab a uvidíte jeho potomky (pokud existují).

Můžete tedy snadno přejít k požadovaným datům:

> echo $ weat weate.Query.results.channel.Atmosphere.Smosféra 
1019.0

>> echo $ weathing.query.results.channel.wind.Chill
41

A pokud máte JSON nebo CSV ležící (nebo vrácený externím příkazem) jako nestrukturovaná data, jednoduše je vložte do ConvertFrom-Json nebo ConvertFrom-CSV cmdlet a můžete mít svá data v pěkných čistých objektech.

Výpočetní práce vs. automatizace

Skořápky používáme ke dvěma účelům. Jedním z nich je výpočetní, spouštět jednotlivé příkazy a ručně reagovat na jejich výstup. Druhým je automatizace, psaní skriptů, které provádějí více příkazů a reagují na jejich výstup programově.

Problém, který se většina z nás naučila přehlížet, je to, že tyto dva účely kladou na shell odlišné a protichůdné požadavky. Computing vyžaduje, aby shell byl lakonický. Čím méně úhozů uživateli unikne, tím lépe. Není důležité, zda to, co uživatel zadal, je pro jinou lidskou bytost stěží čitelné. Skripty jsou na druhou stranu kód. Čitelnost a udržovatelnost jsou klíčové. A zde nám nástroje POSIX často selhávají. Zatímco některé příkazy nabízejí jak lakonickou, tak čitelnou syntaxi (např. -f a --force ) u některých parametrů se samotné názvy příkazů mýlí z hlediska stručnosti, nikoli čitelnosti.

PowerShell obsahuje několik mechanismů k odstranění tohoto faustovského kompromisu.

Za prvé, doplňování tabulátorů eliminuje psaní názvů argumentů. Zadejte například Get-Random -Mi , stiskněte Tab a PowerShell dokončí argument za vás:Get-Random -Minimum . Ale pokud opravdu chcete být lakonicky, nemusíte ani stisknout Tab. Například PowerShell to pochopí

Get-Random -Mi 1 -Ma 10 

protože Mi a Ma každý má jedinečné dokončení.

Možná jste si všimli, že všechny názvy rutin PowerShellu mají strukturu sloveso-podstatné jméno. To může pomoci čitelnosti skriptu, ale pravděpodobně nebudete chtít dál psát Get- znovu a znovu v příkazovém řádku. Takže ne! Pokud zadáte podstatné jméno bez slovesa, PowerShell vyhledá Get- příkaz s tímto podstatným jménem.

Upozornění:Přestože PowerShell nerozlišuje velká a malá písmena, je vhodné použít velké první písmeno podstatného jména, když hodláte použít příkaz PowerShellu. Například zadáním date zavolá date vašeho systému užitečnost. Zadejte Date zavolá Get-Date prostředí PowerShell cmdlet.

A pokud to nestačí, PowerShell má aliasy pro vytváření jednoduchých názvů. Pokud například zadáte alias -name cd , objevíte cd příkaz v PowerShellu je sám o sobě alias pro Set-Location příkaz.

Pro kontrolu – získáte výkonné doplňování záložek, aliasů a doplňování podstatných jmen, aby názvy příkazů byly krátké, automatické a konzistentní zkrácení názvu parametru, a přitom si stále užívat bohatou a čitelnou syntaxi pro skriptování.

Takže... přátelé?

PowerShell má jen některé z výhod. Existuje více funkcí a rutin, o kterých jsem nemluvil (podívejte se na Where-Object nebo jeho alias ? pokud chcete vytvořit grep plakat). A hej, pokud se vám opravdu stýská po domově, PowerShell za vás rád spustí vaše staré nativní nástroje. Dejte si však dostatek času, abyste se aklimatizovali ve světě objektově orientovaných rutin PowerShellu, a možná zjistíte, že se rozhodnete zapomenout na cestu zpět.


Linux
  1. Chápete význam `$_`?

  2. Význam $? Ve skriptu Shell?

  3. Sečtěte sloupec čísel v unixovém shellu

  1. adb:Najděte PID z prostředí adb

  2. Spuštění shellu v kontejneru Docker Alpine

  3. Kódování do base32 z shellu

  1. Počítejte v linuxovém shellu s GNU bc

  2. Aliasy příkazového řádku v prostředí Linux

  3. Co je výchozí shell Busybox?