83 votes

Quand utiliser Bash et quand utiliser Perl/Python/Ruby ?

Jusqu'à présent, nous effectuons tous nos scripts avec Bash, mais je commence à me sentir un peu bête à ce sujet. Bien que nous puissions bien sûr faire tout ce que nous voulons avec Bash (il est assez puissant), je commence à me demander si nous ne devrions pas plutôt utiliser un langage de script approprié (dans notre cas, probablement Ruby).

Comment décider quand utiliser Perl/Python/Ruby plutôt que Bash pour un script ? Je ne pense pas qu'un script init avec Ruby ait un sens, mais que diriez-vous d'un script légèrement plus long qui ajoute des comptes de messagerie ?

6voto

Travis Points 61

Dans mon expérience, bash versus Python est un compromis entre le temps de développement et la flexibilité. Une solution rudimentaire à un problème peut généralement être établie dans un script bash plus rapidement qu'elle ne peut l'être dans un script Python.

Python aura tendance à vous faire réfléchir davantage à la structure de votre solution que l'équivalent bash script. Python a une plus grande puissance d'expression qu'un script de bash et il a donc tendance à mieux évoluer et se modifier au fil du temps. Il reste également plus lisible en général.

Bash est plus proche du système de fichiers et peut être excellent pour les premières ébauches de solutions à des problèmes qui ne sont PAS bien définis. Pour cette raison, un script bash peut être un bon premier choix pour prototyper quelque chose avec l'intention de le porter en Python une fois le problème mieux compris.

5voto

bakytn Points 1647

Bash est un Shell Unix qui comprend un langage de script. Il s'agit plutôt d'un processeur de commandes. vous contrôlez la façon dont vous exécutez les commandes, vous les exécutez réellement.

Perl/Ruby/Python sont des langages à usage général.

Lorsque vous voulez un Shell Shell, vous utilisez Bash

Si vous voulez une tâche plus complexe ou non liée à Shell. Utilisez Python, etc.

Je ne comparerais jamais ces langues en fait. Python, etc. sont portables. Vous pouvez les exécuter n'importe où. Bash est réservé à Unix.

Python, etc. ont des tonnes de bibliothèques réutilisables permettant de résoudre des millions de tâches.

C'est presque la même chose si vous demandez. "Quand utiliser Paint et quand utiliser Photoshop"

Pour le traitement des courriers électroniques, j'utiliserais Ruby, encore une fois, parce qu'il dispose de nombreuses bibliothèques réutilisables.

Mais le meilleur moyen serait de combiner bash et ruby. Ce serait juste. Comme si vous créiez un traitement d'email script dans ruby et bash script invoquerait ce ruby script et exécuterait d'autres commans ds.

Ainsi, lorsque vous avez besoin d'un processeur de commande, vous utilisez bash. Vous exécutez les commandes Unix et les contrôlez.

MISE À JOUR après 7 ans (mars 2019)

Bien que l'essentiel de ma réponse n'ait pas changé, je tiens à souligner que.

Bash est également un puissant langage de script. Pour le traitement de texte, il pourrait être un choix tout à fait légitime.

Veuillez lire les commentaires de mkaito ci-dessous. Ils sont tous complètement vrais.

1voto

Jason Anderson Points 2752

Les Shell Shell comme bash, ksh, zsh, sh, et fish sont notoirement surprenants, comparés aux langages d'usage général de haut niveau comme Ruby, Python, ou Perl. Alors qu'un Shell Shell peut commencer sa vie comme un fichier plus court que le Shell équivalent à usage général, les surprises mènent à beaucoup de code d'emballage défensif, tel que set -euo pipefail pour activer les modes stricts.

Par exemple, la plupart des langages Shell continuent à exécuter les lignes d'un Shell Shell, même si l'une des commandes échoue. En revanche, un langage à usage général échoue immédiatement à la première erreur, et souvent en charge, ce qui entraîne un comportement plus sûr et plus prévisible dans les Shell même de complexité légère.

1voto

C K Points 19

Article très partial.

Je ne trouve pas que bash soit si difficile à déboguer. Python est souvent beaucoup trop rigide, alors que bash vous permet d'être très créatif. Si vous êtes un bon penseur qui sort des sentiers battus, vous aimerez bash.

J'exécute bash scripts sur des millions de lectures de séquençage d'ADN dans des milliers de fichiers, et cela me sert parfaitement. Et contrairement à ce que tout le monde dit, les mêmes versions des scripts en C++ ne s'exécutent en fait pas tellement plus vite (sur quelques minutes les séparent).

Je pense que bash, comme perl, n'est pas le plus convivial/ facile à lire. Cela fait fuir les gens parce que la plupart d'entre eux ne sont pas de grands penseurs abstraits. Mais les programmeurs plus brillants et plus créatifs ont tendance à l'aimer et à l'utiliser fréquemment. Si vous vous connaissez et que vous savez que vous avez un cerveau, ne soyez pas effrayé par le bash. Si vous êtes un penseur de base, restez-en à quelque chose comme Python. Chacun son truc.

1voto

En règle générale, utilisez le la langue la plus simple qui a des performances suffisantes pour votre tâche à accomplir. Et ses particularités uniquement dans la mesure où elles sont vraiment utiles.

Et à propos de la lisibilité, Bash est horrible si votre style de programmation est horrible. Si vous vous contentez d'y jeter du code, il devient obscur.

Mais si vous divisez le code en les fonctions les plus courtes et nommer les choses de manière simple et compréhensible, c'est le langage le plus clair que l'on puisse trouver. Parce que c'est très laconique.

Comme spécimen, voici mon dernier code en Bash. Remarquez comme il est facile à comprendre et à taper :

#! /bin/bash

mainFunction () {
    file="${1}"

    checkFile "${file}"
    executeFile "${file}"
}

changeToThisProgramDir () {
    cd "$( dirname "${BASH_SOURCE[0]}" )"
}

checkFile () {
    file="${1}"

    checkFileNotEmpty "${file}"
    checkFileExist "${file}"
    checkFileIsExe "${file}"
}

checkFileExist () {
    file="${1}"

    if [ ! -f "${file}" ]; then
        echo "The file doesn't exist: ${file}" >&2
        echo "If the name was correct either type: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}

checkFileIsExe () {
    file="${1}"
    mime=$(fileMime "${file}")

    if [ "${mime}" != "application/x-dosexec" ]; then
        echo "Not an exe: ${file}" >&2
        exit 1
    fi
}

checkFileNotEmpty () {
    file="${1}"

    if [ "${file}" == "" ]; then
        echo "No file specified" >&2
        echo "Either type this: exeCute \"pathToYourExeFile\""
        echo "Or just open with exeCute from the file manager"
        exit 1
    fi
}

execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: ${error}" >&2
        exit 1
    fi
}

executeFile () {
    file="${1}"
    type=$(fileType "${file}")

    if [ "${type}" == "MS-DOS executable" ]; then
        execute "executeFile" "dosbox \"${file}\" -forcescaler normal2x -exit -fullscreen"
    else
        execute "executeFile" "wine \"${file}\""
    fi
}

fileMime () {
    file="${1}"

    attributes=$(file --brief --mime "${file}")
    IFS=";" read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}

fileType () {
    file="${1}"

    attributes=$(file --brief "${file}")
    IFS="," read -r -a attributes <<< "${attributes}"
    echo "${attributes[0]}"
}

changeToThisProgramDir
mainFunction "${@}"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X