Articulo de referencia

Script de shell

Edición de un script de shell de FreeBSD para configurar ipfirewall Un script de shell es un programa informático diseñado para ser ejecutado por un intérprete de comandos de Un...

Edición de un script de shell de FreeBSD para configurar ipfirewall

Un script de shell es un programa informático diseñado para ser ejecutado por un intérprete de comandos de Unix . [ 1 ] Los distintos dialectos de los scripts de shell se consideran lenguajes de comandos . Las operaciones típicas que realizan los scripts de shell incluyen la manipulación de archivos, la ejecución de programas y la impresión de texto. Un script que configura el entorno, ejecuta el programa y realiza cualquier limpieza o registro necesario se denomina envoltorio .

El término también se usa de forma más general para referirse al modo automatizado de ejecución de un intérprete de comandos del sistema operativo. Cada sistema operativo utiliza un nombre particular para estas funciones. Todos los sistemas tipo Unix incluyen al menos un intérprete de comandos POSIX , normalmente bash o el modo de compatibilidad zsh . [ 2 ]

Capacidades

Comentarios

Los comentarios son ignorados por el intérprete de comandos. Normalmente comienzan con el símbolo de almohadilla ( #), y continúan hasta el final de la línea. [ 3 ]

Elección configurable del lenguaje de scripting

El shebang , o hash-bang, es un tipo especial de comentario que el sistema utiliza para determinar qué intérprete usar para ejecutar el archivo. El shebang debe ser la primera línea del archivo y comenzar con " #!". [ 3 ] En sistemas operativos tipo Unix, los caracteres que siguen al #!prefijo " " se interpretan como una ruta a un programa ejecutable que interpretará el script. [ 4 ]

Atajos

Un script de shell puede proporcionar una variación conveniente de un comando del sistema donde se aplican automáticamente configuraciones de entorno especiales, opciones de comando o procesamiento posterior, pero de una manera que permite que el nuevo script siga actuando como un comando Unix completamente normal .

Un ejemplo sería crear una versión de ls , el comando para listar archivos, dándole un nombre de comando más corto l, que normalmente se guardaría en el bindirectorio de un usuario como , y un conjunto predeterminado de opciones de comando presupuestadas./home/username/bin/l

#!/bin/sh LC_COLLATE = C ls -FCas " $@ "

Aquí, la primera línea usa un shebang para indicar qué intérprete debe ejecutar el resto del script, y la segunda línea crea una lista con opciones para indicadores de formato de archivo, columnas, todos los archivos (ninguno omitido) y un tamaño en bloques. LC_COLLATE=CEstablece el orden de intercalación predeterminado para no agrupar mayúsculas y minúsculas, no mezclar archivos ocultos con nombres de archivo normales como efecto secundario de ignorar la puntuación en los nombres (los archivos ocultos generalmente solo se muestran si -ase usa una opción como ), y "$@"hace que cualquier parámetro dado a lpase como parámetros a ls, de modo que todas las opciones normales y otra sintaxis conocida por ls aún se pueden usar.

El usuario podría entonces simplemente usarlo lpara la lista corta más utilizada.

Otro ejemplo de un script de shell que podría usarse como atajo sería imprimir una lista de todos los archivos y directorios dentro de un directorio determinado.

#!/bin/sh claro ls -al 

En este caso, el script de shell comenzaría con su línea inicial habitual: #!/bin/sh . A continuación, el script ejecuta el comando clear , que borra todo el texto de la terminal antes de pasar a la siguiente línea. La siguiente línea define la función principal del script. El comando ls -al muestra los archivos y directorios que se encuentran en el directorio desde donde se ejecuta el script. Los atributos del comando ls se pueden modificar según las necesidades del usuario.

Trabajos por lotes

Los scripts de shell permiten ejecutar automáticamente varios comandos que se introducirían manualmente en una interfaz de línea de comandos, sin tener que esperar a que el usuario inicie cada paso de la secuencia. Por ejemplo, en un directorio con tres archivos de código fuente en C, en lugar de ejecutar manualmente los cuatro comandos necesarios para compilar el programa final a partir de ellos, se podría crear un script para shells compatibles con POSIXbuild , aquí denominado y ubicado en el mismo directorio, que los compilaría automáticamente:

#!/bin/sh printf 'Compilando...\n' cc -c foo.c cc -c bar.c cc -c qux.c cc -o myprog foo.o bar.o qux.o printf 'hecho.\n'

El script permitía al usuario guardar el archivo que estaba editando, pausar el editor y luego ejecutarlo ./buildpara crear el programa actualizado, probarlo y volver al editor. Sin embargo, desde la década de 1980, este tipo de scripts han sido reemplazados por utilidades como make , especializadas en la compilación de programas.

Generalización

Los trabajos por lotes simples no son inusuales para tareas aisladas, pero el uso de bucles, pruebas y variables de shell proporciona mucha más flexibilidad a los usuarios. Un script POSIX sh para convertir imágenes JPEG a imágenes PNG, donde los nombres de las imágenes se proporcionan en la línea de comandos (posiblemente mediante comodines) en lugar de que cada una se liste dentro del script, se puede crear con este archivo, que normalmente se guarda en un archivo como/home/username/bin/jpg2png

#!/bin/sh for jpg ; do # usa $jpg en lugar de cada nombre de archivo dado, a su vez png = ${ jpg %.jpg } .png # construye la versión PNG del nombre de archivo reemplazando .jpg con .png printf 'convirtiendo "%s" ...\n' " $jpg " # muestra información de estado al usuario que ejecuta el script if convert " $jpg " jpg.to.png ; then # usa convert (proporcionado por ImageMagick) para crear el PNG en un archivo temporal mv jpg.to.png " $png " # si funcionó, cambia el nombre de la imagen PNG temporal al nombre correcto else # ...de lo contrario, muestra un error y sale del script printf > & 2 'jpg2png: error: error al guardar la salida en "jpg.to.png".\n' exit 1 fi # fin de la prueba "if" construct done # fin del bucle "for" printf 'todas las conversiones exitosas\n' # informa al usuario de las buenas noticias

El jpg2pngcomando se puede ejecutar en un directorio completo lleno de imágenes JPEG con solo/home/username/bin/jpg2png *.jpg

Programación

Muchos intérpretes de comandos modernos también ofrecen diversas características que normalmente solo se encuentran en lenguajes de programación de propósito general más sofisticados , como estructuras de control de flujo, variables, comentarios , matrices, subrutinas , etc. Con estas características disponibles, es posible escribir aplicaciones razonablemente sofisticadas como scripts de shell. Sin embargo, siguen estando limitados por el hecho de que la mayoría de los lenguajes de shell tienen poco o ningún soporte para sistemas de tipado de datos, clases, subprocesos, matemáticas complejas y otras características comunes de lenguajes completos, y también suelen ser mucho más lentos que el código compilado o los lenguajes interpretados diseñados para la velocidad como objetivo de rendimiento.

Las herramientas estándar de Unix, sed y awk, proporcionan capacidades adicionales para la programación de shell; Perl también se puede integrar en scripts de shell, al igual que otros lenguajes de scripting como Tcl . [ 5 ] Perl y Tcl también incluyen kits de herramientas gráficas.

Lenguajes de shell típicos

Los lenguajes de scripting que se encuentran comúnmente en instalaciones de sistemas operativos UNIX, Linux y compatibles con POSIX incluyen:

  • La carcasa Bourne original ( sh), aunque ya no se usa comúnmente, debido a que está protegida por los derechos de autor de AT&T.
  • Concha de Almquist ( ash), variante de la concha de Bourne, bajo derechos de autor de AT&T.
  • Shell Debian Almquist ( dash), una réplica de código abierto de ash, que es "...el shell más rápido de Occidente". [ 6 ] [ 7 ]
  • GNU Bash (Bourne Again SHell) ( bash), réplica de código abierto de Bourne Shell, ahora con más características [ 8 ]
  • Interfaz dinámica BusyBox de Debian ( BusyBox Dynamic Interface), una versión antigua de BASH para Debian 1.3 y anteriores, Slackware y algunos Void. [ 9 ]
  • Fish shell ( fish), Aunque los mantenedores no juran mantener POSIX, en los casos en que POSIX tiene una sintaxis poco intuitiva. FISH es compatible con BASH y sigue el BASHismo. [ 10 ]

Entre los intérpretes de comandos no POSIX de uso común se incluyen:

Los shells C y Tcl tienen una sintaxis bastante similar a la de lenguajes de programación con nombres similares, y los shells Korn y Bash son desarrollos del shell Bourne, que se basa en el lenguaje ALGOL con elementos de otros lenguajes añadidos. [ 11 ] Por otro lado, los diversos shells, junto con herramientas como awk , sed , grep , BASIC , Lisp , C, etc., contribuyeron al lenguaje de programación Perl . [ 12 ]

Entre las conchas que antes eran populares se incluyen:

También existen numerosos programas relacionados, como intérpretes de comandos basados ​​en Python , Ruby , C , Java , Perl , Pascal , Rexx , etc., en diversas formas.

Los llamados shells remotos como

En realidad, son solo herramientas para ejecutar un intérprete de comandos más complejo en un sistema remoto y no tienen características propias de un intérprete de comandos.

Otros lenguajes de scripting

Se han introducido muchos lenguajes de scripting potentes, como Rexx, Python, Perl y Tcl, para abordar tareas que son demasiado grandes, complejas o repetitivas para ser manejadas cómodamente por scripts de shell tradicionales, evitando al mismo tiempo la sobrecarga asociada con lenguajes compilados como C o Java. [ 14 ]

Aunque la distinción entre lenguajes de scripting y lenguajes de programación de alto nivel de propósito general suele ser objeto de debate, los lenguajes de scripting se caracterizan típicamente por su naturaleza interpretada, su sintaxis simplificada y su uso principal en la automatización de tareas, la coordinación de operaciones del sistema y la escritura de "código de unión" entre componentes. [ 15 ] Incluso cuando lenguajes de scripting como Python, Rexx o JavaScript admiten la compilación a bytecode o utilizan JIT para mejorar el rendimiento, todavía se les suele denominar "lenguajes de scripting" debido a su asociación histórica con la automatización, las herramientas ligeras y los entornos de scripting, en lugar del desarrollo de aplicaciones independientes.

La creación de scripts es una forma de programación . Si bien el término "scripting" puede hacer hincapié en la automatización ligera y orientada a tareas, el término más amplio "programación" abarca tanto la creación de scripts como el desarrollo de software en lenguajes compilados o estructurados. Por lo tanto, la creación de scripts implica escribir código para instruir a una computadora sobre cómo realizar tareas específicas, cumpliendo así con la definición fundamental de programación. [ 16 ]

Ciclo vital

Los scripts de shell suelen servir como etapa inicial en el desarrollo de software y, a menudo, se convierten posteriormente a una implementación subyacente diferente, generalmente a Perl , Python o C. La directiva `interpreter` permite ocultar completamente los detalles de implementación dentro del script, en lugar de exponerlos como una extensión de archivo, y facilita la reimplementación sin problemas en diferentes lenguajes sin afectar a los usuarios finales.

Aunque los archivos con la extensión ".sh" suelen ser scripts de shell de algún tipo, la mayoría de los scripts de shell no tienen ninguna extensión de archivo. [ 17 ] [ 18 ] [ 19 ] [ 20 ]

Ventajas y desventajas

Una de las mayores ventajas de escribir un script de shell es que los comandos y la sintaxis son exactamente los mismos que los que se introducen directamente en la línea de comandos. El programador no tiene que cambiar a una sintaxis totalmente diferente, como ocurriría si el script estuviera escrito en otro lenguaje o si se utilizara un lenguaje compilado.

A menudo, escribir un script de shell es mucho más rápido que escribir el código equivalente en otros lenguajes de programación. Entre sus numerosas ventajas se incluyen la fácil selección de programas o archivos, el inicio rápido y la depuración interactiva. Un script de shell puede utilizarse para establecer una secuencia y un vínculo de toma de decisiones en torno a programas existentes, y para scripts de tamaño moderado, la ausencia de un paso de compilación supone una ventaja. La ejecución interpretativa facilita la escritura de código de depuración en un script y su posterior ejecución para detectar y corregir errores. Los usuarios no expertos pueden utilizar scripts para personalizar el comportamiento de los programas, y los scripts de shell ofrecen cierto margen para el procesamiento paralelo.

Por otro lado, la programación de scripts de shell es propensa a errores costosos. Los errores de escritura involuntarios, como rm -rf * /(en lugar del previsto rm -rf */), son folclóricos en la comunidad Unix; un solo espacio adicional convierte el comando de uno que elimina todos los subdirectorios contenidos en el directorio actual, a uno que elimina todo del directorio raíz del sistema de archivos . [ 21 ] Problemas similares pueden convertir cpy mven armas peligrosas, y el mal uso de la >redirección puede eliminar el contenido de un archivo. [ 22 ]

Otra desventaja importante es la lentitud de ejecución y la necesidad de iniciar un nuevo proceso para casi cada comando de shell ejecutado. Si bien la tarea de un script se puede realizar mediante una canalización en la que comandos de filtrado eficientes ejecutan la mayor parte del trabajo, la lentitud se reduce, pero un script complejo suele ser varios órdenes de magnitud más lento que un programa compilado convencional que realiza una tarea equivalente.

También existen problemas de compatibilidad entre diferentes plataformas. Larry Wall , creador de Perl , escribió la famosa frase: "Es más fácil portar un intérprete de comandos que un script de intérprete de comandos". [ 23 ]

De manera similar, los scripts más complejos pueden toparse con las limitaciones del propio lenguaje de scripting de shell; estas limitaciones dificultan la escritura de código de calidad, y las extensiones de varios shells para mitigar problemas con el lenguaje de shell original pueden empeorar los problemas. [ 24 ]

Muchas desventajas del uso de algunos lenguajes de scripting se deben a fallos de diseño en la sintaxis o la implementación del lenguaje, y no necesariamente son impuestas por el uso de una línea de comandos basada en texto; existen varios shells que utilizan otros lenguajes de programación de shell o incluso lenguajes completos como Scsh (que utiliza Scheme ).

Interoperabilidad entre lenguajes de scripting

Muchos lenguajes de scripting comparten sintaxis y características similares debido a su adhesión al estándar POSIX , y varios intérpretes de comandos ofrecen modos para emular o mantener la compatibilidad con otros. Esto permite que los scripts escritos para un intérprete de comandos a menudo se ejecuten en otro con cambios mínimos.

Por ejemplo, Bash admite gran parte de la sintaxis original de Bourne shell y ofrece un modo compatible con POSIX para mejorar la portabilidad. Sin embargo, Bash también incluye varias extensiones que no se encuentran en POSIX, comúnmente conocidas como bashismos . Si bien estas características mejoran las capacidades de scripting, pueden reducir la compatibilidad con otros shells como Dash o ksh .

Programación de scripts de shell en otros sistemas operativos

El software de interoperabilidad, como Cygwin , MKS Toolkit , Interix (anteriormente parte de Microsoft Windows Services for UNIX), Hamilton C shell y UWIN (AT&T Unix for Windows), permite ejecutar programas de shell de Unix en sistemas basados ​​en Windows NT, aunque algunas funciones podrían no ser totalmente compatibles con las plataformas más antiguas de MS-DOS / Windows 95. Las versiones anteriores de MKS Toolkit también ofrecían compatibilidad con OS/2.

Los lenguajes de scripting, por definición, pueden extenderse. En Unix y otros sistemas compatibles con POSIX , awk y sed se utilizan para extender la capacidad de procesamiento de cadenas y números de los scripts de shell. Tcl , Perl, Rexx y Python tienen kits de herramientas gráficas y pueden usarse para codificar funciones y procedimientos para scripts de shell que representan un cuello de botella de velocidad (C, Fortran, lenguaje ensamblador, etc., son mucho más rápidos) y para agregar funcionalidad no disponible en el lenguaje de shell, como sockets y otras funciones de conectividad, procesamiento de texto de alto rendimiento, trabajar con números si el script que llama no tiene esas capacidades, código autoescrito y automodificable, técnicas como recursión , acceso directo a memoria, varios tipos de ordenación y más, que son difíciles o imposibles en el script principal, etc. Visual Basic para Aplicaciones y VBScript pueden usarse para controlar y comunicarse con elementos como hojas de cálculo, bases de datos, programas scriptables de todo tipo, software de telecomunicaciones, herramientas de desarrollo, herramientas gráficas y otro software al que se puede acceder a través del Modelo de Objetos Componentes .

Véase también

Referencias

  1. Kernighan, Brian W .; Pike, Rob (1984). "3. Uso del intérprete de comandos". El entorno de programación UNIX . Prentice Hall, Inc. pág. 94. ISBN  0-13-937699-2En realidad , la consola es un lenguaje de programación: tiene variables, bucles, toma de decisiones, etc.
  2. Arnold Robbins y Nelson HF Beebe (2005). Classic Shell Scripting . O'Reilly Media. pág. 5. ISBN  978-0-596-00595-5.
  3. 1 2 Johnson, Chris (2009). Programación Pro Bash: Creación de scripts para el intérprete de comandos de Linux . Apress. ISBN 9781430219989. Consultado el 27 de septiembre de 2019 .
  4. "exec(3p) – Manual del programador POSIX" . Consultado el 24 de julio de 2020 .
  5. Stephen G. Kochan, Patrick H. Wood (2003). Programación de shell de Unix . Sams Publishing. pág. 243. ISBN  9780672324901.
  6. https://linuxhandbook.com/dash-shell/
  7. https://www.terminal.guide/shell/dash/
  8. https://www.gnu.org/software/bash/
  9. https://busybox.net/
  10. https://waitwhat.sh/blog/the_case_for_fish/
  11. Shells de Unix por ejemplo, págs. 7-10,
  12. Wall, Larry; Christiansen, Tom; Orwant, Jon (2012). Programación en Perl (5.ª ed.). O'Reilly Media. p. Prefacio. ISBN   9781449303587.
  13. "osh - manned.org" . manned.org . Consultado el 16 de enero de 2019 .
  14. Flanagan, David (2020). JavaScript: La guía definitiva . O'Reilly Media. pág. 2. ISBN  9781491952023.
  15. Harold, Elliotte Rusty (2013). Programación de redes Java . O'Reilly Media. pág. 6. ISBN  9781449365943.
  16. Lutz, Mark (2013). Aprendiendo Python (5.ª ed.). O'Reilly Media. pág. 6. ISBN   9781449355739A menudo se denomina a Python lenguaje de scripting, pero en realidad es simplemente un lenguaje de programación de propósito general que también es bueno para el scripting. De hecho, el scripting es solo un subconjunto de la programación en general.
  17. Robbins, Arnold; Hannah, Elbert; Lamb, Linda (2008). Aprendiendo a usar los editores vi y Vim . O'Reilly Media, Inc. pág. 205. ISBN  9781449313258.
  18. Easttom, Chuck (2012). Administración esencial de Linux: una guía completa para principiantes . Course Technology/Cengage Learning. pág. 228. ISBN  978-1435459571.
  19. Kumari, Sinny (23 de noviembre de 2015). Fundamentos de scripting de shell de Linux . Packt Publishing Ltd. ISBN 9781783552375. Recuperado el 7 de mayo de 2017 . En lugar de usar una extensión de archivo para los scripts de shell, es preferible mantener un nombre de archivo sin extensión y dejar que un intérprete identifique el tipo buscando en shebang(#!).
  20. Taylor, Dave; Perry, Brandon (16 de diciembre de 2016). Wicked Cool Shell Scripts, 2.ª edición: 101 scripts para sistemas Linux, OS X y UNIX . No Starch Press. ISBN 9781593276027. Recuperado el 7 de mayo de 2017 . Los scripts de shell no necesitan una extensión de archivo especial, así que deje la extensión en blanco (o puede agregar la extensión .sh si lo prefiere, pero esto no es necesario.
  21. Shotts, William (2019). La línea de comandos de Linux . No Starch Press. pág. 72. ISBN  9781593279523.
  22. ^ Albing, Carl; Vossen, JP; Newham, Cameron (2007). Libro de cocina Bash . Medios O'Reilly. pag. 53.ISBN  9780596526788.
  23. Larry Wall (4 de enero de 1991). "Encontrando el último argumento" . Grupo de noticias : comp.unix.shell . Consultado el 5 de enero de 2023 . 
  24. Christiansen, Tom. "La programación en Csh se considera perjudicial" .
  • Introducción a la programación de shell por Greg Goebel
  • Tutorial de scripting de shell de UNIX/Linux por Steve Parker
  • Introducción a la programación de scripts de shell (Apple)
  • Qué tener en cuenta al escribir scripts de shell portátiles, por Peter Seebach
  • Libros gratuitos sobre scripting de shell de Unix
  • Programación en Bash para principiantes , Ubuntu Linux
Obtenido de " https://en.wikipedia.org/w/index.php?title=Shell_script&oldid=1362562247 "