Comment remplacer Bash par Python comme langage de ligne de commande

J'ai un peu une relation d'amour et de haine avec bash. Je passe beaucoup de temps dans le terminal et bash est mon "langage de programmation" par défaut. Parfois, je dis aux gens que find, grep et xargs gèrent leur infrastructure, et ils rient et rient jusqu'à ce qu'ils réalisent que je suis sérieux.

Prendre un peu de Python est un choix parfait pour les administrateurs système. C'est également idéal pour tous ceux qui doivent gérer quoi que ce soit dans un terminal mais qui ne veulent pas utiliser bash ou qui ont des besoins trop complexes pour bash. Une fois qu'une tâche dépasse

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

il est temps de sortir le Python!

Il y a de nombreux avantages à utiliser Python comme langage de ligne de commande.

  • Python a beaucoup de belles bibliothèques pour vous aider avec à peu près tout. Cela inclut le traitement des opérations système, la lecture de fichiers, la liste des répertoires, l'écriture de boucles, la vérification des codes de sortie, etc.
  • Saisie semi-automatique avec les IDE. Sérieusement. Qui veut avoir à mémoriser quoi que ce soit?
  • Suite de tests robuste si c'est votre truc (et si ce n'est pas le cas, vous devriez envisager d'en faire votre truc).
  • La console iPython. C'est merveilleux. C'est incroyable. J'AIME CELA.
  • Python est disponible sur la plupart des systèmes, et si ce n'est pas le cas, vous pouvez l'obtenir avec Miniconda.
  • Vérification d'erreurs robuste avec des blocs try and catch.
  • Si vous travaillez sur différents systèmes d'exploitation, vous pouvez utiliser des bibliothèques Python qui s'occuperont de tout cela sous le capot.
  • Même si vous n'avez aucune capacité de programmation, Python est un langage facile à utiliser.

Commençons

Pour commencer, vous devez d'abord installer Python ou l'installer avec Miniconda.

Vérifiez si iPython est installé

which python which ipython 

Si les deux réussissent, vous êtes en affaires! Si vous avez Python, mais pas iPython, vous devrez l'installer. Vous pouvez l'installer en tant que package système, mais je vous recommande vraiment de l'installer simplement avec Miniconda.

Installez Miniconda

Prenez le programme d'installation de votre système d'exploitation ici. Je suggère d'obtenir l'installation de Python3.

Ensuite, ce n'est qu'une simple installation.

bash Miniconda3-latest-Linux-x86_64.sh 

Suivez les invites et vous aurez Miniconda3 installé. Une fois que vous l'avez installé, vous voudrez exécuter une mise à jour, car c'est une technologie et bien sûr, vous voulez exécuter une mise à jour. ;-)

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

Dépannage

Si vous rencontrez des difficultés pour installer des packages, voici quelques conseils.

  • Exécutez conda clean --allet réessayez.
  • Assurez-vous que vous utilisez le bon canal.
  • Courir conda update -y --all
  • Essayez d'installer le moins possible dans votre espace conda global. Créez plutôt des environnements pour différentes tâches et projets, que nous aborderons ensuite.

Créer des environnements avec Conda

Si vous avez déjà utilisé virtualenv, pipenv (est-ce que c'est une chose?), Rbenv, plenv, anyenv ou l'un des autres environnements qui ont surgi au fil des ans, cela vous semblera très familier. L'idée est que différents projets doivent avoir leurs propres environnements logiciels isolés.

conda create -n my-project ipython package1 package2 package2 

Si vous êtes comme moi et que vous aimez avoir iPython facilement disponible, assurez-vous de l'installer dans tous les nouveaux environnements!

Bibliothèques Python pour l'administration système

Avant d'entrer dans les exemples, énumérons simplement quelques packages pratiques avec leurs documents.

Mon package go to est le package os. Vous pouvez l'utiliser pour lister des répertoires, vérifier si des fichiers existent, vérifier si des liens symboliques existent, créer des répertoires, exécuter des commandes système, obtenir et définir des variables d'environnement, etc. C'est bien!

Mon deuxième package pour exécuter des commandes système qui n'existent pas en tant que bibliothèques python pratiques est le module de sous-processus.

Le shutil a des opérations sur les fichiers qui ne sont pas dans la bibliothèque os.

La bibliothèque pprint imprime des structures de données complexes avec une belle indentation.

La bibliothèque pytest vous permet de tester votre code Python, car avouons-le, rien ne fonctionne jamais correctement les premières (quelques) premières fois.

Comment exécuter mon code?

Finalement! Code!

Capture d'écran-2019-12-13-10.33.52

Lorsque vous utilisez Python pour l'administration système, vous pouvez plonger directement dans la console iPython, ou écrire des scripts, puis les exécuter avec python name-of-script.py.

Si vous préférez écrire vos scripts, vous avez tellement de choix, et c'est vraiment une question de préférence personnelle. J'utilise PyCharm, qui est payant, mais Visual Studio Code et Atom sont également d'excellents choix gratuits.

Je trouve que cela dépend de ce sur quoi je travaille. Parfois, j'ouvre simplement la console iPython et commence à taper, et d'autres fois, j'ai besoin de quelque chose de plus robuste avec des tests et autres.

Si vous utilisez la console iPython ou l'un des éditeurs que j'ai répertoriés ci-dessus, vous aurez la saisie semi-automatique. La saisie semi-automatique est géniale! Avec iPython, commencez simplement à taper votre fonction et appuyez sur Tab pour obtenir une liste des fonctions potentielles que vous pourriez souhaiter.

Capture d'écran-2019-12-13-10.49.07

Je ne peux pas exprimer à quel point j'aime la saisie semi-automatique. ;-)

Obtenir de l'aide

Vous pouvez accéder à l'une des pages de documentation de n'importe quelle bibliothèque, mais si vous connaissez le nom de la bibliothèque ou de la fonction, vous pouvez l'afficher dans iPython.

Capture d'écran-2019-12-13-10.55.14

Capture d'écran-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!