Kako zamijeniti Bash s Pythonom kao jezikom naredbenog retka

Imam pomalo ljubavnu i mržnju s bashom. Provodim puno vremena u terminalu, a bash je moj zadani "programski jezik". Ponekad kažem ljudima da find, grep i xargs vode njihovu infrastrukturu, a oni se smiju i smiju dok ne shvate da sam ozbiljan.

Pokupiti malo Pythona savršen je izbor za administratore sustava. Izvrsno je i za svakoga tko ima posla s bilo čime na terminalu, ali ne želi koristiti bash ili ima potrebe koje su previše složene za bash. Jednom kada zadatak prijeđe dalje

find $(pwd) -name "*.txt" | xargs -I {} echo "do stuff with {}"

vrijeme je da izbijemo Python!

Puno je prednosti korištenja Pythona kao vašeg jezika naredbenog retka.

  • Python ima puno lijepih knjižnica koje pomažu u gotovo svemu. To uključuje bavljenje sistemskim operacijama, čitanje datoteka, popisivanje direktorija, pisanje petlji, provjeru izlaznih kodova i tako dalje.
  • Automatsko dovršavanje s IDE-ima. Ozbiljno. Tko želi nešto zapamtiti?
  • Robusni paket za testiranje ako je to vaša stvar (a ako nije, trebali biste razmisliti da to napravite svojom stvari).
  • Konzola iPython. Predivno je. Odlično je. VOLIM TO.
  • Python je dostupan na većini sustava, a ako nije, možete ga dobiti s Minicondom.
  • Robusna provjera pogrešaka s try and catch blokovima.
  • Ako radite na različitim operativnim sustavima, možete koristiti Python knjižnice koje će se nositi sa svime onim što je ispod haube.
  • Čak i ako nemate mogućnosti programiranja, Python je jednostavan jezik za početak.

Započnimo

Da biste započeli, prvo morate instalirati Python ili ga instalirati s Minicondom.

Provjerite je li instaliran iPython

which python which ipython 

Ako su oba uspješna, poslujete! Ako imate Python, ali ne i iPython, morat ćete ga instalirati. Možete ga instalirati kao sistemski paket, ali stvarno preporučujem da ga instalirate s Minicondom.

Instalirajte Minicondu

Ovdje zgrabite instalacijski program za svoj OS. Predlažem da nabavite instalaciju Python3.

Tada je to samo jednostavna instalacija.

bash Miniconda3-latest-Linux-x86_64.sh 

Slijedite upute i instalirat ćete Miniconda3. Jednom kada ga instalirate, poželjet ćete pokrenuti ažuriranje, jer ovo je tehnologija i naravno želite pokrenuti ažuriranje. ;-)

conda update conda conda config --add channels conda-forge conda update -y --all conda install -y ipython 

Rješavanje problema

Ako imate problema s instaliranjem bilo kojeg paketa, evo nekoliko savjeta.

  • Pokrenite conda clean --alli pokušajte ponovo.
  • Provjerite upotrebljavate li ispravan kanal.
  • Trčanje conda update -y --all
  • Pokušajte instalirati što manje na svoj globalni conda prostor. Umjesto toga stvorite okruženja za različite zadatke i projekte, u koje ćemo ući sljedeće.

Stvorite okruženja s Condom

Ako ste ikada koristili virtualenv, pipenv (je li to stvar?), Rbenv, plenv, anyenv ili bilo koju drugu raznu env koja se pojavila tijekom godina, ovo će vam zvučati vrlo poznato. Ideja je da različiti projekti trebaju imati svoja izolirana softverska okruženja.

conda create -n my-project ipython package1 package2 package2 

Ako ste poput mene i želite da iPython bude dostupan, obavezno ga instalirajte u nova okruženja!

Python knjižnice za administraciju sustava

Prije nego što uđemo u primjere, navedimo samo neke praktične pakete zajedno s njihovim dokumentima.

Moj paket za prelazak je os paket. Pomoću nje možete popisati direktorije, provjeriti postoje li datoteke, provjeriti postoje li simbolične veze, napraviti direktorije, pokrenuti sistemske naredbe, dobiti i postaviti varijable okoline i još mnogo toga. Super je!

Moj drugi paket za izvođenje sistemskih naredbi koji ne postoje kao praktične python knjižnice je modul potprocesa.

Shutil ima operacije datoteka koje nisu u os biblioteci.

Biblioteka pprint ispisuje složene podatkovne strukture s lijepim uvlakama.

Pytest biblioteka omogućuje vam testiranje vašeg Python koda, jer, priznajmo, prva (nekoliko) puta nikad ništa ne radi ispravno.

Kako izvršiti svoj kod?

Konačno! Kodirati!

Snimka zaslona-2019-12-13-10.33.52

Kada koristite Python za administraciju sustava, možete zaroniti ravno u konzolu iPython ili napisati skripte i zatim ih izvršiti pomoću python name-of-script.py.

Ako više volite pisati svoje skripte, imate toliko izbora, a to je uistinu stvar osobnih preferencija. Koristim PyCharm, koji se plaća, ali Visual Studio Code i Atom jednako su izvrsni besplatni odabiri.

Smatram da to ovisi o onome na čemu radim. Ponekad jednostavno otvorim iPython konzolu i počnem tipkati, a drugi put trebam nešto robusnije s testovima i slično.

Ako koristite iPython konzolu ili bilo koji od prethodno navedenih urednika, imat ćete automatsko dovršavanje. Automatsko dovršavanje je sjajno! S iPythonom jednostavno počnite tipkati svoju funkciju i pritisnite karticu da biste dobili popis potencijalnih funkcija koje biste mogli željeti.

Snimka zaslona-2019-12-13-10.49.07

Ne mogu izraziti koliko volim automatsko dovršavanje. ;-)

Dobiti pomoć

Možete otići na bilo koju od stranica dokumenata za bilo koju knjižnicu, ali ako znate naziv bilo knjižnice ili funkcije, možete je otvoriti u iPythonu.

Snimka zaslona-2019-12-13-10.55.14

Snimka zaslona-2019-12-13-10.55.55

You can bring up the help menu in most IDEs and text editors too, but that will be specific to your editor.

Examples

First you will need to import your packages

import os import subprocess import shutil from pprint import pprint 

Here are some examples of common file and directory operations.

# Get your current working directly # This returns a string my_cwd = os.getcwd() print(my_cwd) 
# List the contents of a directory # This returns a list dir_list = os.listdir() for item in dir_list: print(item) 
# Get the Absolute Path name of a file (file + current working dir) os.path.abspath('some-file') 
#Get the basename - returns file os.path.basename('/path/to/file') 
# Split a directory path - platform independent os.path.split(os.getcwd()) # Out[17]: ('/Users', 'jillian') 
# Check if a path exists os.path.exists('/path/on/filesystem') 
# Check if a path is a symlink os.path.islink() 

Move files and directories around

# Copy a directory # cp -rf shutil.copytree('src', 'dest') 
# Copy a file # cp -rf shutil.copyfile('file1', 'file2') 
# Move a directory # mv shutil.move('src', 'dest') 

Not everything is going to be available through python libraries, such as installing system libraries, so run a few system commands!

# Run an arbitrary system command command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE, stderr=subprocess.PIPE) #Print the stdout and stderr print(result.stdout) print(result.stderr) 

Write to files!

# Write to a file (and create it if it doesn't exist) # echo "hello" > hello.txt f= open("hello.txt","w+") f.write("hello!") f.close() 
# Append to a file # echo "hello" >> hello.txt f = open("hello.txt", "a+") f.write("hello again!") f.close() 

Write some tests!

Tests mostly work by using a function called assert, which is essentially saying make sure this is true and if not die loudly.

def test_system_command(): """Test the exit code of a system command""" command = "echo 'hello'" result = subprocess.run(command.split(' '), stdout=subprocess.PIPE) assert result.returncode == 0 

Put this function in a file called test_my_code.py and run as pytest test_my_code.py.

Wrap Up

That's it for my main tips and tricks for using Python as your go-to bash replacement. The next time you need to write a loop in bash, consider breaking out the iPython console and seeing what you can come up with instead!