[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: (bash vs *sh) Re: exécuter automatiquement un programme dépendant du suffixe



salut Steve,

On Thu, Oct 08, 2020 at 11:35:44AM +0200, steve wrote:
> J'ai des dizaine de script écrits en Bash. Existe-t-il un moyen
> automatique de les porter sous Zsh?

il n'y a pas de de tanspiler bash vers zsh. par contre zsh et
bash ont un gros tronc commun qui est la syntaxe ksh (et il me semble
qu'il y a des options de compatibilité bash dans zsh) et ksh n'est
qu'une évolution du bourne shell (sh) dont dash est l'implémentation
qui fait consensus aujourd'hui.

Donc a priori, j'aimerais te dire qu'il suffit de prendre ton script
bash, de modifier le shebang et de voir ce qui casse...sauf que si t'as
un rm (ou autre commande avec de possibles forts effets de bord), tu
risques de faire des degats avec des incompatibilités qui amènent
eventuellement a avoir un comportement très loin de ce qui est attendu.

Voici donc des idées de filets pour sécuriser un peu ta démarche:

0. se renseigner sur les bashisms et voir ce que zsh propose à la place

eventuellement identifier les bashisms automatiquement ?

    http://manpages.ubuntu.com/manpages/bionic/man1/checkbashisms.1.html

1. fais tout ca depuis un container

debootstrap + ( chroot | lxroot ) , docker, ... il a plétore de solutions.

j'aurais tendance a faire une copie du container apres installation
histoire de pouvoir d'un container preinstallé si besoin.

2. change le shebang

    sed -i.bak 1s,$(which bash),$(which zsh), la liste de tes scripts

3. relance tes tests pour voir si tout se passe bien

si tout se passe bien: c'est fini :) tu peux changer les shebangs
partout

4. si tu as/veux plus erreurs

ben il faut lire et corriger. je dis "tu veux plus d'erreur" parce que
il faut savoir que les pires erreurs sont celles qui arrivent
tardivement. aussi je te conseille d'ajouter ces lignes dans ton
~/.zshenv:

    setopt warncreateglobal nounset pipefail

5. corriger

tu as 2 stratégies possibles:

* virer les bashims et te rapprocher de la norme POSIX (du coup tu
  pourrais meme tenter de rendre ton script compatible avec mksh ou dash)

* remplacer les bashisms par des zshisms ... c'est vraiment très
  plaisant et puissant mais ca nécessite zsh (et des collègues qui
  adhèrent à l'idée). tu vas te retrouver dans la meme situation que
  perl vs python: d'un coté un truc puissant que "personne ne peut lire"
  (en gros: pas le temps de lire la doc) et d'un autre survendu comme
  "la référence" et "super lisible".

  exemple:

  en zsh tu peux écrire
  dpkg -S $( readlink -f $(which vi) )

  avec l'habitude tu vas plutôt écrire
  dpkg -S =vi(:A)

  mais tu risques de te faire pourrir par les collègues

  Aussi: apres 25 ans de shell scripting, je me rend compte que la puissance
  de zsh m'a fait passé à coté de l'élégance de commandes comme bc, mkfifo, xargs, ...
  aussi j'ai tendance maintenant à écrire des scripts avec des shells
  beaucoup plus légers (rc a ma préférence mais il y a aussi dash et
  mksh).


cordialement,
marc




Reply to: