Tout d'abord, démontrons que head
fonctionne correctement :
$ printf '\xef\xbb\xbf' >file
$ head -c 3 file
$ head -c 3 file | hexdump -C
00000000 ef bb bf |...|
00000003
Maintenant, créons une fonction fonctionnelle has_bom
. Si votre grep
supporte -P
, alors une option est :
$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
Actuellement, seul GNU grep
supporte -P
.
Une autre option consiste à utiliser le $'...'
de bash :
$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
ksh
et zsh
prend également en charge $'...'
mais cette construction n'est pas POSIX et dash
ne le supporte pas.
Remarques :
-
L'utilisation d'un
return $?
explicite est facultatif. La fonction reviendra par défaut avec le code de sortie de la dernière commande exécutée. -
J'ai utilisé le formulaire POSIX pour définir des fonctions. Ceci est équivalent au formulaire bash mais vous donne un problème de moins à gérer si jamais vous devez exécuter la fonction sous un autre shell.
-
bash accepte l'utilisation du caractère
-
dans un nom de fonction, mais c'est une fonctionnalité controversée. Je l'ai remplacé par_
qui est plus largement accepté. (Pour en savoir plus sur ce problème, consultez cette réponse.) -
Le
-q
option àgrep
le rend silencieux, ce qui signifie qu'il définit toujours un code de sortie approprié mais qu'il n'envoie aucun caractère à stdout.
J'ai appliqué ce qui suit pour la première ligne lue :
read c
if (( "$(printf "%d" "'${c:0:1}")" == 65279 )) ; then c="${c:1}" ; fi
Cela supprime simplement la nomenclature de la variable.