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
-qopción agreplo 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.