Y a-t-il un sh
code qui n'est pas du code bash syntaxiquement valide (ne barf sur la syntaxe)?
Je pense à écraser sh
avec bash
pour certaines commandes.
bash
shell-script
posix
Alexander Mills
la source
la source
((
vient à l'esprit./usr/bin/sh
c'est juste un lien symbolique vers/usr/bin/bash
(j'utilise CentOS 7.3 et c'est le cas). Vous devriez vérifier sish
c'est vraimentbash
pour votre distribution.#!/bin/sh
à#!/bin/bash
. Ensuite, tout a fonctionné à nouveau, vous devez donc être très prudent. Cela est peut-être arrivé lorsqu'ils ont commencé à utiliser dash au lieu de bash pour sh.Réponses:
Voici du code qui fait quelque chose de différent dans POSIX sh et Bash:
Que ce soit "invalide" pour vous, je ne sais pas.
Dans Bash, il réoriente à la fois la sortie standard et l' erreur standard de
hello
dans le fichierworld
. Dans POSIXsh
, il s'exécutehello
en arrière-plan puis effectue une redirection vide dansworld
, la tronquant (c'est-à-dire qu'il est traité comme& >
).Il existe de nombreux autres cas où les extensions Bash feront leur travail lorsqu'elles seront exécutées sous
bash
, et auraient des effets différents dans un POSIX pursh
. Par exemple, l' expansion des accolades en est une autre, et elle fonctionne également de la même manière en mode POSIX de Bash et non.En ce qui concerne les erreurs de syntaxe statiques, Bash a à la fois des mots réservés (comme
[[
ettime
) non spécifiés par POSIX, tels que du[[ x
code shell POSIX valide mais une erreur de syntaxe Bash, et un historique de divers bogues d'incompatibilité POSIX qui peuvent entraîner des erreurs de syntaxe, comme celui de cette question :Syntax-errors-only est une définition assez dangereuse de "invalide" dans toutes les circonstances où cela est important, mais il est là.
la source
{fd}>file
un problème similaire), afin que bash puisse être à nouveau conforme (expansion d'accolade resterait non spécifié, mais des scripts conformes devraient faireecho "{a,b}"
s'ils veulent{a,b}
être sortis). Voir la discussion qui a commencé/bin/sh
est bash, donc si je n'étais pas activement au courant de ce bashisme, en écrivant une ligne de commande, cela pourrait facilement arriver. L'espacement dans la réponse le rend peu probable, maishello&>world
est moins tiré par les cheveux.&>
différence le mois dernier!Un petit exemple:
time
dans Bash est un mot réservé et se comporte différemment dutime
programme. Il est fort probable que vous cassiez certains scripts pratiques en essayant d'analyser le résultattime
en utilisant bash. Mais techniquement, ce n'est pas une erreur de syntaxe. La redéfinition entime
tant que fonction serait rare mais provoque une erreur de syntaxe comme cette question le spécifie.Un exemple plus court:
Valide dans
dash
, mais pas compatible POSIX.la source
time
, il y a des choses commedeclare
,function
,select
etcoproc
. Bien que certains d'entre eux soient explicitement marqués comme non spécifiés dans la norme ( mots - clés et prédéfinis / utilitaires ), mais je ne peux pas voir par exempletime
oucoproc
dans la liste. Et l'utilisation--posix
ne semble pas aider.