So ersetzen Sie Bash durch Python als Go-To-Befehlszeilensprache

Ich habe ein bisschen eine Hassliebe zu Bash. Ich verbringe viel Zeit im Terminal und Bash ist meine Standard- "Programmiersprache". Manchmal erzähle ich Leuten, dass Find, Grep und Xargs ihre Infrastruktur betreiben, und sie lachen und lachen, bis sie erkennen, dass ich es ernst meine.

Das Aufnehmen von Python ist eine perfekte Wahl für Systemadministratoren. Es ist auch großartig für alle, die sich mit irgendetwas in einem Terminal befassen müssen, aber keine Bash verwenden möchten oder Bedürfnisse haben, die für Bash zu komplex sind. Sobald eine Aufgabe darüber hinausgeht

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

Es ist Zeit, die Python auszubrechen!

Die Verwendung von Python als Befehlszeilensprache bietet viele Vorteile.

  • Python hat viele nette Bibliotheken, die bei so ziemlich allem helfen können. Dazu gehören Systemoperationen, das Lesen von Dateien, das Auflisten von Verzeichnissen, das Schreiben für Schleifen, das Überprüfen auf Exit-Codes usw.
  • Autocomplete mit IDEs. Ernsthaft. Wer möchte sich etwas merken müssen?
  • Robuste Testsuite, wenn das dein Ding ist (und wenn nicht, solltest du darüber nachdenken, es zu deinem Ding zu machen).
  • Die iPython-Konsole. Es ist wundervoll. Es ist wunderbar. ICH LIEBE ES.
  • Python ist auf den meisten Systemen verfügbar, und wenn dies nicht der Fall ist, können Sie es mit Miniconda herunterladen.
  • Robuste Fehlerprüfung mit Try-and-Catch-Blöcken.
  • Wenn Sie unter verschiedenen Betriebssystemen arbeiten, können Sie Python-Bibliotheken verwenden, die sich mit all dem unter der Haube befassen.
  • Auch wenn Sie keine Programmierkenntnisse haben, ist Python eine einfache Sprache, mit der Sie beginnen können.

Lass uns anfangen

Zunächst müssen Sie entweder Python oder Miniconda installiert haben.

Überprüfen Sie, ob Sie iPython installiert haben

which python which ipython 

Wenn beide erfolgreich sind, sind Sie im Geschäft! Wenn Sie Python, aber nicht iPython haben, müssen Sie es installieren. Sie könnten es als Systempaket installieren, aber ich empfehle Ihnen wirklich, es nur mit Miniconda zu installieren.

Installieren Sie Miniconda

Holen Sie sich hier das Installationsprogramm für Ihr Betriebssystem. Ich schlage vor, die Python3-Installation zu bekommen.

Dann ist es nur eine einfache Installation.

bash Miniconda3-latest-Linux-x86_64.sh 

Befolgen Sie die Anweisungen und Sie haben Miniconda3 installiert. Sobald Sie es installiert haben, möchten Sie ein Update ausführen, da dies technisch ist und Sie natürlich ein Update ausführen möchten. ;-);

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

Fehlerbehebung

Wenn Sie Probleme bei der Installation von Paketen haben, finden Sie hier einige Tipps.

  • Führen Sie es aus conda clean --allund versuchen Sie es erneut.
  • Stellen Sie sicher, dass Sie den richtigen Kanal verwenden.
  • Lauf conda update -y --all
  • Versuchen Sie, so wenig wie möglich in Ihrem globalen Conda-Bereich zu installieren. Erstellen Sie stattdessen Umgebungen für verschiedene Aufgaben und Projekte, auf die wir als Nächstes eingehen werden.

Erstellen Sie Umgebungen mit Conda

Wenn Sie jemals virtualenv, pipenv (ist das eine Sache?), Rbenv, plenv, anyenv oder eine der anderen verschiedenen Umgebungen verwendet haben, die im Laufe der Jahre aufgetaucht sind, wird Ihnen dies sehr bekannt vorkommen. Die Idee ist, dass verschiedene Projekte ihre eigenen isolierten Softwareumgebungen haben sollten.

conda create -n my-project ipython package1 package2 package2 

Wenn Sie wie ich sind und iPython sofort verfügbar haben möchten, stellen Sie sicher, dass Sie es in neuen Umgebungen installieren!

Python-Bibliotheken für die Systemadministration

Bevor wir zu den Beispielen kommen, listen wir einfach einige praktische Pakete zusammen mit ihren Dokumenten auf.

Mein Go-to-Paket ist das OS-Paket. Sie können damit Verzeichnisse auflisten, prüfen, ob Dateien vorhanden sind, ob Symlinks vorhanden sind, Verzeichnisse erstellen, Systembefehle ausführen, Umgebungsvariablen abrufen und festlegen und vieles mehr. Es ist großartig!

Mein zweites Paket zum Ausführen von Systembefehlen, die nicht als handliche Python-Bibliotheken existieren, ist das Unterprozessmodul.

Das Shutil verfügt über Dateioperationen, die sich nicht in der Betriebssystembibliothek befinden.

Die Druckbibliothek druckt komplexe Datenstrukturen mit schönen Einrückungen aus.

Mit der Pytest-Bibliothek können Sie Ihren Python-Code testen, denn ehrlich gesagt funktioniert beim ersten (wenigen) Mal nichts richtig.

Wie führe ich meinen Code aus?

Schließlich! Code!

Screenshot-2019-12-13-10.33.52

Wenn Sie Python für die Systemadministration verwenden, können Sie direkt in die iPython-Konsole eintauchen oder Skripte schreiben und diese dann mit ausführen python name-of-script.py.

Wenn Sie es vorziehen, Ihre Skripte zu schreiben, haben Sie so viele Möglichkeiten, und es ist wirklich eine Frage der persönlichen Präferenz. Ich benutze PyCharm, das bezahlt wird, aber Visual Studio Code und Atom sind gleichermaßen ausgezeichnete freie Wahl.

Ich finde, dass es davon abhängt, woran ich arbeite. Manchmal öffne ich einfach die iPython-Konsole und beginne zu tippen, und manchmal brauche ich etwas Robusteres mit Tests und so weiter.

Wenn Sie entweder die iPython-Konsole oder einen der oben aufgeführten Editoren verwenden, wird die automatische Vervollständigung ausgeführt. Autocomplete ist großartig! Mit iPython können Sie einfach Ihre Funktion eingeben und die Tabulatortaste drücken, um eine Liste der möglichen Funktionen zu erhalten, die Sie möglicherweise möchten.

Screenshot-2019-12-13-10.49.07

Ich kann nicht ausdrücken, wie sehr ich Autocomplete liebe. ;-);

Hilfe erhalten

Sie können für jede Bibliothek zu jeder Dokumentseite gehen. Wenn Sie jedoch den Namen der Bibliothek oder die Funktion kennen, können Sie sie in iPython aufrufen.

Screenshot-2019-12-13-10.55.14

Screenshot-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!