stringtranslate.com

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 shell Unix , un intérprete de línea de comandos . [1] Los distintos dialectos de los scripts de shell se consideran lenguajes de scripting . Las operaciones típicas realizadas por scripts de shell incluyen manipulación de archivos, ejecución de programas e impresión de texto. Un script que configura el entorno, ejecuta el programa y realiza cualquier limpieza o registro necesario se denomina contenedor .

El término también se usa de manera más general para referirse al modo automatizado de ejecutar un shell de sistema operativo; Cada sistema operativo utiliza un nombre particular para estas funciones, incluidos archivos por lotes (transmisión MSDos-Win95, OS/2 ), procedimientos de comando (VMS) y scripts de shell ( transmisión de Windows NT y derivados de terceros como 4NT ; el artículo se encuentra en cmd. exe ) y los sistemas operativos mainframe están asociados con una serie de términos.

Los shells comúnmente presentes en Unix y sistemas similares incluyen el shell Korn , el shell Bourne y GNU Bash . Si bien un sistema operativo Unix puede tener un shell predeterminado diferente, como Zsh en macOS , estos shells suelen estar presentes por motivos de compatibilidad con versiones anteriores.

Capacidades

Comentarios

El shell ignora los comentarios . Por lo general, comienzan con el símbolo de almohadilla ( #) y continúan hasta el final de la línea. [2]

Elección configurable de lenguaje de scripting

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

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 posprocesamiento, 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 enumerar archivos, dándole un nombre de comando más corto de l, que normalmente se guardaría en el bindirectorio de un usuario como , y un conjunto predeterminado de opciones de comando previamente suministrado./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 hace una lista con opciones para indicadores de formato de archivo, columnas, todos los archivos (ninguno omitido) y un tamaño en bloques. Establece LC_COLLATE=Cel orden de clasificación predeterminado para no combinar mayúsculas y minúsculas, no mezclar archivos de puntos con nombres de archivos normales como efecto secundario de ignorar la puntuación en los nombres (los archivos de puntos generalmente solo se muestran si -ase usa una opción como) y "$@"causa cualquier parámetro . dado a lpasar como parámetros a ls, de modo que todas las opciones normales y otras sintaxis conocidas por ls aún se puedan usar.

Luego, el usuario podría simplemente utilizar lla lista corta más utilizada.

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

#!/bin/shclarols  - al

En este caso, el script de shell comenzaría con su línea inicial normal de #!/bin/sh . Después de esto, el script ejecuta el comando clear que borra todo el texto del terminal antes de pasar a la siguiente línea. La siguiente línea proporciona la función principal del script. El comando ls -al enumera los archivos y directorios que se encuentran en el directorio desde el que se ejecuta el script. Los atributos del comando ls se pueden cambiar para reflejar las necesidades del usuario.

Trabajos por lotes

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

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

El script permitiría al usuario guardar el archivo que se está editando, pausar el editor y luego simplemente ejecutarlo ./buildpara crear el programa actualizado, probarlo y luego regresar al editor. Sin embargo, desde la década de 1980 aproximadamente, los scripts de este tipo han sido reemplazados por utilidades como make , que están especializadas en crear programas.

Generalización

Los trabajos por lotes simples no son inusuales para tareas aisladas, pero el uso de bucles de shell, pruebas y variables proporciona mucha más flexibilidad a los usuarios. Con este archivo se puede crear 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 uno aparezca en el script, generalmente guardado en un archivo como/home/username/bin/jpg2png

#!/bin/sh para  jpg ; # use $jpg en lugar de cada nombre de archivo dado, a su vez png = ${ jpg %.jpg } .png # construya la versión PNG del nombre de archivo reemplazando .jpg con .png printf 'convirtiendo "%s"... \n' " $jpg " # envía información de estado al usuario que ejecuta el script si convierte " $jpg " jpg.to.png ; luego # use convert (proporcionado por ImageMagick) para crear el PNG en un archivo temporal mv jpg.to.png " $png " # si funcionó, cambie el nombre de la imagen PNG temporal al nombre correcto de lo contrario # ...de lo contrario, presente una queja y salga del script printf > & 2 'jpg2png: error: salida fallida guardada en "jpg.to.png".\n' exit 1 fi # el final de la construcción de prueba "if" realizada # el final del bucle "for" printf 'todas las conversiones exitosas\n' # informa al usuario las buenas noticias                              

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

Programación

Muchos shells modernos también proporcionan varias características que normalmente sólo se encuentran en lenguajes de programación de propósito general más sofisticados , como construcciones de flujo de control, variables, comentarios , matrices, subrutinas , etc. Con este tipo de funciones disponibles, es posible escribir aplicaciones razonablemente sofisticadas como scripts de shell. Sin embargo, todavía están limitados por el hecho de que la mayoría de los lenguajes shell tienen poco o ningún soporte para sistemas de tipificación de datos, clases, subprocesos, matemáticas complejas y otras características comunes del lenguaje completo, y también son generalmente mucho más lentos que el código compilado o los lenguajes interpretados escritos. con 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 incrustar en scripts de shell, al igual que otros lenguajes de scripting como Tcl . Perl y Tcl también vienen con kits de herramientas gráficas.

Lenguajes de scripting POSIX típicos

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

Los shells C y Tcl tienen una sintaxis bastante similar a la de dichos lenguajes de programación, y los shells Korn y Bash son desarrollos del shell Bourne, que se basa en el lenguaje ALGOL al que también se le han agregado elementos de otros. [4] Por otro lado, los diversos shells más herramientas como awk , sed , grep y BASIC , Lisp , C , etc. contribuyeron al lenguaje de programación Perl . [5]

Otros shells que pueden estar disponibles en una máquina o para descargar y/o comprar incluyen:

También están ampliamente disponibles programas relacionados, como shells basados ​​en Python , Ruby , C , Java , Perl , Pascal , Rexx , etc. en diversas formas. Otro shell algo común es Old shell ( osh), cuya página de manual dice que "es un puerto mejorado y compatible con versiones anteriores del intérprete de comandos estándar de la Sexta Edición de UNIX". [6]

Los llamados shells remotos como

En realidad, son solo herramientas para ejecutar un shell más complejo en un sistema remoto y no tienen características similares a las de un 'shell'.

Otros lenguajes de programación

Se han introducido muchos lenguajes de secuencias de comandos potentes para tareas que son demasiado grandes o complejas para poder manejarlas cómodamente con secuencias de comandos de shell ordinarias, pero para las cuales las ventajas de una secuencia de comandos son deseables y la sobrecarga de desarrollo de un lenguaje de programación compilado completo sería desventajosa. . Los detalles específicos de lo que separa los lenguajes de programación de los lenguajes de programación de alto nivel son una fuente frecuente de debate, pero, en términos generales, un lenguaje de programación es aquel que requiere un intérprete.

Ciclo vital

Los scripts de Shell a menudo sirven como etapa inicial en el desarrollo de software y, a menudo , están sujetos a conversión posterior a una implementación subyacente diferente, generalmente a Perl , Python o C. La directiva del intérprete permite que los detalles de implementación queden completamente ocultos dentro del script, en lugar de exponerse como una extensión de nombre de archivo, y proporciona una reimplementación perfecta en diferentes idiomas sin impacto en los usuarios finales.

Si bien los archivos con la extensión ".sh" suelen ser un script de shell de algún tipo, la mayoría de los scripts de shell no tienen ninguna extensión de nombre de archivo. [7] [8] [9] [10]

Ventajas y desventajas

Quizás la mayor ventaja de escribir un script de shell es que los comandos y la sintaxis son exactamente los mismos que los ingresados ​​directamente en la línea de comandos. El programador no tiene que cambiar a una sintaxis totalmente diferente, como lo haría si el script estuviera escrito en un idioma diferente 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. Las muchas ventajas incluyen una fácil selección de programas o archivos, inicio rápido y depuración interactiva. Se puede utilizar un script de shell para proporcionar un vínculo de secuenciación y toma de decisiones en torno a programas existentes, y para scripts de tamaño moderado la ausencia de un paso de compilación es una ventaja. La ejecución interpretativa facilita escribir código de depuración en un script y volver a ejecutarlo para detectar y corregir errores. Los usuarios no expertos pueden utilizar scripts para adaptar el comportamiento de los programas, y los scripts de shell proporcionan un margen limitado para el multiprocesamiento.

Por otro lado, los scripts de shell son propensos a errores costosos. Los errores tipográficos inadvertidos como rm -rf * /(en lugar de lo previsto rm -rf */) son folklore en la comunidad Unix; un único 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 . Problemas similares pueden transformarse cpen mvarmas peligrosas, y el mal uso de la >redirección puede eliminar el contenido de un archivo. Esto se vuelve más problemático por el hecho de que muchos comandos UNIX difieren en nombre por una sola letra: cp, cd, dd, dfetc.

Otra desventaja importante es la lenta velocidad de ejecución y la necesidad de iniciar un nuevo proceso para casi cada comando de shell ejecutado. Cuando el trabajo de un script se puede realizar configurando una canalización en la que comandos de filtro eficientes realizan la mayor parte del trabajo, la desaceleración se mitiga, 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 shell que un script de shell". [11]

De manera similar, los scripts más complejos pueden encontrarse con las limitaciones del propio lenguaje de scripting del shell; los límites dificultan la escritura de código de calidad, y las extensiones mediante varios shells para mejorar los problemas con el lenguaje del shell original pueden empeorar los problemas. [12]

Muchas desventajas del uso de algunos lenguajes de escritura se deben a fallas de diseño en la sintaxis o implementación del lenguaje, y no necesariamente están impuestas por el uso de una línea de comandos basada en texto; Hay varios shells que usan otros lenguajes de programación de shell o incluso lenguajes completos como Scsh (que usa Scheme ).

Interoperabilidad entre lenguajes de scripting

Los diferentes lenguajes de scripting pueden compartir muchos elementos comunes, en gran parte debido a que están basados ​​en POSIX, y algunos shells ofrecen modos para emular diferentes shells. Esto permite adaptar un script de shell escrito en un lenguaje de script a otro.

Un ejemplo de esto es Bash, que ofrece la misma gramática y sintaxis que el shell Bourne y que también proporciona un modo compatible con POSIX. [13] Como tal, la mayoría de los scripts de shell escritos para el shell Bourne se pueden ejecutar en BASH, pero lo contrario puede no ser cierto ya que BASH tiene extensiones que no están presentes en el shell Bourne. Como tal, estas características se conocen como bashismos. [14]

Secuencias de comandos de Shell en otros sistemas operativos

El software de interoperabilidad como Cygwin , MKS Toolkit , Interix (que está disponible en los servicios de Microsoft Windows para UNIX), Hamilton C shell , UWIN (AT&T Unix para Windows) y otros permiten que los programas de shell Unix se ejecuten en máquinas que ejecutan Windows NT y sus sucesores, con cierta pérdida de funcionalidad en la rama MS-DOS - Windows 95 , así como en versiones anteriores de MKS Toolkit para OS/2. Al menos tres implementaciones DCL para sistemas operativos tipo Windows, además de XLNT , un paquete de lenguaje de scripting de usos múltiples que se utiliza con el shell de comandos, Windows Script Host y programación CGI , también están disponibles para estos sistemas. Mac OS X y posteriores también son similares a Unix. [15]

Además de las herramientas antes mencionadas, algunas funciones POSIX y OS/2 también se pueden utilizar con los subsistemas ambientales correspondientes de la serie de sistemas operativos Windows NT hasta Windows 2000. Un tercer subsistema de 16 bits , a menudo llamado subsistema MS-DOS, utiliza Command.com proporcionado con estos sistemas operativos para ejecutar los archivos por lotes de MS-DOS antes mencionados. [dieciséis]

Las alternativas de consola 4DOS , 4OS2 , FreeDOS , NDOS de Peter Norton y 4NT/Take Command que añaden funcionalidad a los archivos por lotes cmd.exe de estilo Windows NT, MS-DOS/Windows 95 (ejecutados por Command.com), OS/ 2 cmd.exe y 4NT respectivamente son similares a los shells que mejoran y están más integrados con Windows Script Host, que viene con tres motores preinstalados, VBScript, JScript y VBA y al que pueden acceder numerosos motores de terceros. agregarse, con Rexx, Perl, Python, Ruby y Tcl teniendo funciones predefinidas en 4NT y programas relacionados. PC DOS es bastante similar a MS-DOS, mientras que DR DOS es más diferente. Las versiones anteriores de Windows NT pueden ejecutar versiones contemporáneas de 4OS2 mediante el subsistema OS/2.

Los lenguajes de scripting, por definición, se pueden ampliar; por ejemplo, un sistema tipo MS-DOS/Windows 95/98 y Windows NT permite que los programas shell/batch llamen a herramientas como KiXtart , QBasic , varias implementaciones de BASIC , Rexx , Perl y Python , Windows Script Host y sus motores instalados. . En Unix y otros sistemas compatibles con POSIX , awk y sed se utilizan para ampliar la capacidad de procesamiento numérico y de cadenas 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 plantean un cuello de botella en la velocidad (C, Fortran, lenguaje ensamblador, etc. son mucho más rápidos aún) y para agregar funcionalidades que no están disponibles en el shell. lenguaje como sockets y otras funciones de conectividad, procesamiento de texto de alta resistencia, trabajo con números si el script de llamada no tiene esas capacidades, código de autoescritura y automodificación, técnicas como recursividad , acceso directo a la memoria, varios tipos de clasificación y más, que son difíciles o imposibles en el guión principal, etc. Visual Basic para Aplicaciones y VBScript se pueden utilizar para controlar y comunicarse con cosas como hojas de cálculo, bases de datos, programas de secuencias de comandos 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 .

Ver también

Referencias

  1. ^ Kernighan, Brian W .; Pike, Rob (1984), "3. Uso de Shell", El entorno de programación UNIX , Prentice Hall, Inc., pág. 94, ISBN 0-13-937699-2El shell es en realidad un lenguaje de programación: tiene variables, bucles, toma de decisiones, etc.
  2. ^ ab Johnson, Chris (2009). Programación Pro Bash: secuencias de comandos del Shell de Linux. Presione. ISBN 9781430219989. Consultado el 27 de septiembre de 2019 .
  3. ^ "exec(3p) - Manual del programador POSIX" . Consultado el 24 de julio de 2020 .
  4. ^ Shells de Unix por ejemplo, págs. 7-10,
  5. ^ Programación Perl, quinta edición, prefacio
  6. ^ "osh-manned.org". tripulado.org . Consultado el 16 de enero de 2019 .
  7. ^ Robbins, Arnold; Ana, Elbert; Cordero, Linda (2008). Aprendiendo los editores vi y Vim. "O'Reilly Media, Inc.". pag. 205.ISBN 9781449313258.
  8. ^ Easttom, Chuck (2012). Administración esencial de Linux: una guía completa para principiantes. Curso Tecnología/Cengage Learning. pag. 228.ISBN 978-1435459571.
  9. ^ Kumari, Sinny (23 de noviembre de 2015). Conceptos básicos de secuencias de comandos de Shell de Linux. Packt Publishing Ltd. ISBN 9781783552375. Consultado el 7 de mayo de 2017 . En lugar de usar una extensión de archivo para scripts de shell, se prefiere mantener un nombre de archivo sin extensión y dejar que un intérprete identifique el tipo buscando en shebang(#!).
  10. ^ Taylor, Dave; Perry, Brandon (16 de diciembre de 2016). Wicked Cool Shell Scripts, segunda edición: 101 scripts para sistemas Linux, OS X y UNIX. Sin prensa de almidón. ISBN 9781593276027. Consultado 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 no es necesaria).
  11. ^ Larry Wall (4 de enero de 1991). "Encontrar el último argumento". Grupo de noticias : comp.unix.shell . Consultado el 5 de enero de 2023 .
  12. ^ Christiansen, Tom. "La programación Csh se considera dañina".
  13. ^ "Grandes diferencias con el Bourne Shell".
  14. ^ "24 Bashismo que se deben evitar en scripts de Shell compatibles con POSIX". 18 de mayo de 2022.
  15. ^ MSDN [ no es lo suficientemente específico como para verificarlo ]
  16. ^ Kit de recursos para estaciones de trabajo Windows NT 4

enlaces externos