¿Cuál es el más portátil de sed, awk, perl y sh?


15

¿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:

  1. awk
  2. sed
  3. sh
  4. 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 awky sedtienen 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?


Los sistemas integrados a menudo sacrifican la portabilidad para mantenerse mínimos. Muchos no son compatibles con POSIX.
jordanm

@jordanm, ¿eso significa que posiblemente no tengan ninguno de estos? Asumo un sistema que proporciona al menos una interfaz de shell mínima. Sé que busybox proporciona sh, awky sedpor ejemplo, y mi NAS basado en busybox también tiene perl.
terdon

1
Puede tenerlos, pero lo que hacen variará según los sistemas, por lo que la pregunta no tiene mucho sentido, como se afirma.
Stéphane Chazelas

@StephaneChazelas ah, ¿podrías ayudarme a reducirlo entonces? ¿No es posible ordenarlos en función de la probabilidad de que se encuentren en el sistema X? Mi experiencia es estrictamente Linux y un par de sistemas NAS integrados. Sé que nunca obtendrás un GNU / Linux sin los 4 de estos, pero ¿no puedes darme una idea de cuál de ellos es más seguro asumir que está presente?
terdon

Respuestas:


15

¿Cuál es el más portátil de sed, awk, perl y sh?

sed, shY awkson portátiles siendo especificado por POSIX, perlno es tan no ser respaldado por una norma.

¿Alguien puede poner estas herramientas en orden de portabilidad?

Si se apega al código compatible, no debe haber un orden de portabilidad para los tres comandos POSIX.

¿Cuál de estos es seguro que se encuentra incluso en los sistemas más mínimos * nix?

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.

¿Alguno de ellos está 100% seguro de estar presente?

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.

Supongo que el orden es el siguiente: algún shell estará presente como predeterminado, ¿siempre estará en / bin / sh?

/bin/shes 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/shen Solaris 10 y anteriores, mientras que /bin/shes el shell Bourne original heredado que no es POSIX.


12

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 [:

 if [ $foo = bar ] ; then...

así que la práctica de Autoconf es reescribirlo entre comillas dobles con un prefijo de un solo carácter, así:

 if [ x"$foo" = "xbar" ] ; then...

También puedes usar "x$foo"aquí. Esto protege contra la posibilidad de que $foopueda ser una opción válida test(1)y, como [es un alias test, podría malinterpretar la expresión. La solución es establecer una situación en la que [siempre comience el argumento desconocido x, lo que significa que no puede tener un significado especial [.

(Autoconf también recomienda usar en testlugar 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 awkimplementación incluso en algunos sistemas Linux integrados muy restrictivos. Aún así, me sorprendería menos encontrar un sistema sin él awkque sed. 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:

  • Cygwin
  • FreeBSD y NetBSD
  • instalaciones "mínimas" para algunos Linux, incluido Slackware
  • muchos Linux embebidos que dependen principalmente de Busybox para su país de usuario

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, awky muchos otros.


Gracias, pero me pregunto sobre el orden de portabilidad de estos. Si te leo bien, estás sugiriendo eso shy sederes el más portátil. OK, ¿y los demás? ¿Y es shrealmente 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?
terdon

Gracias por la edición, eso es lo que pasa, ambos sedy awkson proporcionados por busybox, ¿por qué estarías más sorprendido de encontrar sedausente? ¿Tienes alguna idea si las alternativas de busybox también proporcionan sed y awk?
terdon

Re: POSIX vs Bourne shell , reescribió el consejo de pegarse a LCD de los dos. Re: citando la prueba , recordé mal la razón, pero encontré el capítulo en el manual de Autoconf donde se cubre la razón, y edité la respuesta en consecuencia. Re: sed vs awk y Busybox , expliqué eso: mayor complejidad y triaje. sedhace menos, por lo que su binario será más pequeño, por lo tanto, hay menos razones para eliminarlo que awk, 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.
Warren Young

+1 Porque estoy de acuerdo con su premisa general aquí (que el mínimo común denominador será algún tipo de sh- ¿extraño que el terdon se ubique awky por sedencima 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.
Ricitos de Oro

1
@WarrenYoung ese es el tipo de cosas por las que me preguntaba. No tengo (no tengo idea) de si todos los sistemas * nix realmente tendrían un shell bourne instalado por defecto. Si todos tienen un /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 :).
terdon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.