Primero, demostremos que head
está funcionando correctamente:
$ printf '\xef\xbb\xbf' >file
$ head -c 3 file
$ head -c 3 file | hexdump -C
00000000 ef bb bf |...|
00000003
Ahora, creemos una función funcional has_bom
. Si tu grep
admite -P
, entonces una opción es:
$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
Actualmente, solo GNU grep
admite -P
.
Otra opción es usar $'...'
de bash :
$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes
ksh
y zsh
también admite $'...'
pero esta construcción no es POSIX y dash
no lo admite.
Notas:
-
El uso de un
return $?
explícito es opcional. La función, de forma predeterminada, regresará con el código de salida de la última ejecución del comando. -
He usado el formulario POSIX para definir funciones. Esto es equivalente al formulario bash pero le da un problema menos con el que lidiar si alguna vez tiene que ejecutar la función bajo otro shell.
-
bash acepta el uso del carácter
-
en un nombre de función, pero esta es una característica controvertida. Lo reemplacé con_
que es más ampliamente aceptado. (Para obtener más información sobre este tema, consulte esta respuesta). -
El
-q
opción agrep
lo hace silencioso, lo que significa que aún establece un código de salida adecuado pero no envía ningún carácter a la salida estándar.
Apliqué lo siguiente para la primera línea de lectura:
read c
if (( "$(printf "%d" "'${c:0:1}")" == 65279 )) ; then c="${c:1}" ; fi
Esto simplemente elimina la lista de materiales de la variable.