¿Qué no es específico de shell?

9

Debajo de algunas respuestas, veo comentarios que recomiendan evitar comandos específicos de shell en las respuestas.

¿Cómo sé qué comandos, operadores, etc. existen en todos los shells? ¿Hay una lista de estándares?

  • man builtinsda una lista de comandos. ¿Son esos los únicos comandos que puedo usar en un script de shell portátil que funciona en todos los shells?
  • ¿Puede un incorporado ser específico de shell?
  • ¿Los estándares para Linux difieren de los de otros Unixes?
  • ¿Qué pasa con la sintaxis? ¿Pueden los signos de puntuación, operadores, etc. ser diferentes en algunos shells?
musa
fuente

Respuestas:

12

Greg's Wiki tiene una publicación sobre la adaptación de los scripts de bash para Dash que señala muchos 'bashismos', características adicionales que no son estándar pero son parte de bash. Evitar esos bashisms puede ayudar a que su script sea más amigable para diferentes entornos. Esto responde particularmente a algunas de sus preguntas. Por ejemplo, sí, hay operadores que difieren (como ==), pero hay un conjunto estándar de Posix que debería funcionar en todos los entornos.

Para una lectura más completa, puede consultar el estándar Posix , que todos los shells deben cumplir. Particularmente, el volumen en "Shell y utilidades".

Lo que encuentro más desafiante que las diferencias de shell son las diferencias de comando. Muchos sistemas Linux tienen GNU find, pero si estás escribiendo un script portátil, no confíes en el tuyo man find, porque hay muchos sistemas con BSD find, que tiene un conjunto de características diferente. Si está escribiendo scripts para busybox, encontrará que hay diferentes versiones con ncs completamente diferentes . Esas son las cosas que siempre me atrapan cuando implemento un script en diferentes entornos.

Para leer más sobre las buenas prácticas de scripting de shell, también hay un buen recurso en el blog de David Pashley: Escritura de scripts robustos de Bash Shell

Además, asegúrese de leer las respuestas y comentarios de Gilles en este sitio. Tiene muchos consejos sobre cómo asegurarse de que use un código portátil.

Shawn J. Goff
fuente
5

Escribir un script de shell en un shell específico significa tener ese shell instalado. El único estándar es tener cshe shinstalar sobre todas las variantes de Unix. Entonces, si desea que su script se ejecute en Solaris, * BSD y GNU, entonces debería escribirlo, por ejemplo, en el shell Bourne.

Sin embargo, la mayoría de los comandos de Unix tienen diferentes sintaxis en diferentes implementaciones, mire psbajo Solaris, FreeBSD y GNU, por lo que, dependiendo de las herramientas que use, su script puede no ser portátil de todos modos. El lugar donde está instalado el shell también será importante. ¿Es /bin/bash /usr/bin/bash, /usr/local/bin/basho en otro lugar?

No conozco ningún estándar que defina un shell. Eche un vistazo a rc o http://192.220.96.201/es/es-usenix-winter93.html`">es para conchas extrañas no estándar. Sin embargo, parece que todavía se ajustan a algunas ideas comunes.

Sardathrion - contra el abuso SE
fuente
77
POSIX define sh.
Random832