¿Alguien puede poner estas herramientas en orden de portabilidad? ¿Cuál de estos es seguro que se encuentra incluso en los sistemas más mínimos * nix? ¿Alguno de ellos está 100% seguro de estar presente? Supongo que el orden es el siguiente:
- awk
- sed
- sh
- perl
Si bien me imagino que hay sistemas que no utilizan por defecto un shell bourne, algún shell estará presente como predeterminado, ¿siempre estará en /bin/sh
? Presumiblemente no si no es un caparazón tipo bourne. Ambos awk
y sed
tienen páginas que los explican en la especificación POSIX, por lo que presumiblemente siempre estarán presentes. ¿Es eso así? ¿Puedo estar seguro de que ambos se instalarán en cualquier * nix? ¿Incluidos los sistemas embebidos?
posix
portability
terdon
fuente
fuente
sh
,awk
ysed
por ejemplo, y mi NAS basado en busybox también tiene perl.Respuestas:
sed
,sh
Yawk
son portátiles siendo especificado por POSIX,perl
no es tan no ser respaldado por una norma.Si se apega al código compatible, no debe haber un orden de portabilidad para los tres comandos POSIX.
Los tres POSIX junto con muchas otras utilidades son obligatorios para que un SO sea POSIX. Sin embargo, existen sistemas operativos que carecen de algunos de ellos debido a la minimización, o que proporcionan implementaciones incompletas / no conformes.
En realidad, la mayoría (si no todos) los sistemas operativos Unix de código abierto y libre probablemente no pasarían el proceso de conformidad si lo intentan, y nunca lo intentan de todos modos.
Me sorprendería encontrar un sistema operativo * nix que carece de un shell basado en la sintaxis Bourne, pero todo es posible, especialmente con sistemas integrados.
/bin/sh
es probable que sea un shell de familia de sintaxis Bourne, pero no se garantiza que sea compatible con POSIX, incluso en sistemas compatibles con POSIX. Por ejemplo, está/usr/xpg4/bin/sh
en Solaris 10 y anteriores, mientras que/bin/sh
es el shell Bourne original heredado que no es POSIX.fuente
Siga las indicaciones de los Autotools: manténgase en el mínimo común denominador de Bourne y POSIX shell, posiblemente aumentado por
sed
, si tiene que escribir algo que debe funcionar en todas partes . Es posible que existan sistemas en los que algo se rompa, pero puede solucionar estos problemas reescribiendo.Por ejemplo, algunos sistemas antiguos tienen problemas con errores de expansión
test
, también conocidos como[
:así que la práctica de Autoconf es reescribirlo entre comillas dobles con un prefijo de un solo carácter, así:
También puedes usar
"x$foo"
aquí. Esto protege contra la posibilidad de que$foo
pueda ser una opción válidatest(1)
y, como[
es un aliastest
, podría malinterpretar la expresión. La solución es establecer una situación en la que[
siempre comience el argumento desconocidox
, lo que significa que no puede tener un significado especial[
.(Autoconf también recomienda usar en
test
lugar de[
, pero ese consejo surge como una reacción a posibles conflictos con M4 , que también usa[
en su sintaxis).awk es POSIX , por lo que teóricamente está disponible en todas partes. Incluso está en Busybox , por lo que tendrá una
awk
implementación incluso en algunos sistemas Linux integrados muy restrictivos. Aún así, me sorprendería menos encontrar un sistema sin élawk
quesed
. Supongo que todo se reduce a la complejidad: las herramientas más simples tienen más probabilidades de sobrevivir al triaje agresivo.Perl no forma parte de ningún estándar generalizado, POSIX o de otro tipo, por lo que simplemente no puede contar con él si no sabe nada de antemano sobre el entorno de destino. Perl no está instalado por defecto en:
El manual de Autoconf tiene un capítulo sobre programación de shell portátil que debería serle útil. Las herramientas de última sección cubre gusta
sed
,awk
y muchos otros.fuente
sh
ysed
eres el más portátil. OK, ¿y los demás? ¿Y essh
realmente así de portátil? ¿Qué sucede si el shell predeterminado es un derivado de C-shell? ¿Este sistema todavía tendrá un enlace simbólico en/bin/sh
?sed
yawk
son proporcionados por busybox, ¿por qué estarías más sorprendido de encontrarsed
ausente? ¿Tienes alguna idea si las alternativas de busybox también proporcionan sed y awk?sed
hace menos, por lo que su binario será más pequeño, por lo tanto, hay menos razones para eliminarlo queawk
, lo cual es bastante complejo. (20 kiB frente a 48 kiB en mi sistema). Re: Alternativas de Busybox , no conozco ninguna otra alternativa de compra única.sh
- ¿extraño que el terdon se ubiqueawk
y porsed
encima de este o_O?) Aunque esto solo es coincidencia con los propósitos de Autotool, ya que algunos entornos, particularmente los pequeños, puede no estar destinado a la construcción, punto./bin/sh
, entonces las cosas son diferentes, pero no sabía que todos tendrían uno. Perdón por no aceptar esto por cierto, estaba dividido entre las respuestas tuyas y jlliagre, las cuales respondieron mi pregunta. Elegí el suyo porque lo abordó más directamente y porque tiene menos reputación :).