Un script de shell es un programa de computadora diseñado para ser ejecutado por el shell de Unix , un intérprete de línea de comandos . [1] Los diversos dialectos de los scripts de shell se consideran lenguajes de scripting . Las operaciones típicas realizadas por los scripts de shell incluyen la manipulación de archivos, la ejecución de programas y la impresión de texto. Una secuencia de comandos que configura el entorno, ejecuta el programa y realiza cualquier limpieza, registro, etc. necesarios 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; en sistemas operativos específicos se les llama de otras formas, como archivos por lotes (flujo MSDos-Win95, OS / 2 ), procedimientos de comando (VMS) y scripts de shell ( flujo de Windows NT y derivados de terceros como 4NT; el artículo está en cmd). exe ) y los sistemas operativos de mainframe están asociados con una serie de términos.
La instalación típica compatible con Unix / Linux / POSIX incluye KornShell ( ksh
) en varias versiones posibles, como ksh88, Korn Shell '93 y otras. El shell más antiguo todavía de uso común es el shell Bourne ( sh
); Los sistemas Unix invariablemente también incluyen el shell C ( csh
), Bash ( bash
), un Shell remoto ( rsh
), un Secure Shell ( ssh
) para conexiones telnet SSL y un shell que es un componente principal de la instalación Tcl / Tk normalmente llamado ; wish es un shell Tcl / Tk basado en GUI. 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 con elementos de varios otros añadidos también. [2] Por otro lado, los distintos shells más herramientas como awk , sed , grep y BASIC , Lisp , C , etc. contribuyeron al lenguaje de programación Perl . [3]tclsh
Otros shells disponibles en una máquina o disponibles para descargar y / o comprar incluyen Almquist shell ( ash
), PowerShell ( msh
), Z shell ( zsh
, un KornShell mejorado particularmente común), el Tenex C Shell ( tcsh
) y un shell similar a Perl ( psh
) . Los programas relacionados, como shells basados en Python , Ruby , C , Java , Perl , Pascal , Rexx , etc. en varias formas, también están ampliamente disponibles. Otro shell algo común es Old shell ( osh
), cuya página de manual indica que "es un puerto mejorado y compatible con versiones anteriores del intérprete de comandos estándar de Sixth Edition UNIX". [4]
El software de interoperabilidad Windows-Unix como MKS Toolkit , Cygwin , UWIN , Interix y otros hacen que los shells anteriores y la programación Unix estén disponibles en los sistemas Windows, brindando funcionalidad hasta las señales y otras comunicaciones entre procesos , llamadas al sistema y API . El shell de Hamilton C es un shell de Windows que es muy similar al shell de Unix C. Microsoft distribuyó Windows Services para UNIX para su uso con sus sistemas operativos basados en NT en particular, que tienen un subsistema ambiental POSIX .
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. [5]
Elección configurable de lenguaje de secuencias de comandos
El shebang , o hash-bang, es un tipo especial de comentario que el sistema usa para determinar qué intérprete usar para ejecutar el archivo. El shebang debe ser la primera línea del archivo y comenzar con " #! ". [5] En sistemas operativos similares a Unix, los caracteres que siguen al prefijo " #! " Se interpretan como una ruta a un programa ejecutable que interpretará el script. [6]
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 listar archivos, dándole un nombre de comando más corto de l , que normalmente se guardaría en el directorio bin de un usuario como / home / username / bin / l , y un conjunto predeterminado de opciones de comando pre-suministradas.
#! / 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 (no se omite ninguno) y un tamaño en bloques. El LC_COLLATE = C establece el orden de intercalación predeterminada para no doblar superior e inferior caso juntos, no Intermix dotfiles con nombres de archivo normales como un efecto secundario de ignorar puntuacion en los nombres (dotfiles en general sólo se muestran si una opción como -a se utiliza), y "$ @" hace que los parámetros dados a l pasen como parámetros a ls, de modo que todas las opciones normales y otras sintaxis conocidas por ls aún puedan usarse.
Entonces, el usuario podría simplemente usar l para 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 dado.
#! / 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 de la 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.
Nota: Si una implementación no tiene el comando clear , intente usar el comando clr en su lugar.
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 POSIX , aquí llamado build y guardado en el directorio con ellos, que los compilaría automáticamente:
#! / bin / sh printf 'compilando ... \ n'cc -c foo.ccc -c bar.ccc -c qux.ccc -o myprog foo.o bar.o qux.oprintf 'hecho. \ n'
La secuencia de comandos permitiría al usuario guardar el archivo que se está editando, pausar el editor y luego ejecutar ./build para crear el programa actualizado, probarlo y luego regresar al editor. Desde la década de 1980, sin embargo, los scripts de este tipo han sido reemplazados por utilidades como make, que están especializadas en la creación de programas.
Generalización
Los trabajos por lotes simples no son inusuales para tareas aisladas, pero el uso de ciclos de shell, pruebas y variables proporciona mucha más flexibilidad a los usuarios. Se puede crear un script POSIX sh para convertir imágenes JPEG en 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 de ellos se enumere en el script, con este archivo, normalmente guardado en un archivo como / inicio / nombre de usuario / bin / jpg2png
#! / bin / sh para jpg ; do # 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 (provisto 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 si no # ... de lo contrario, queje 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" terminado # el final del ciclo "for" printf 'todas las conversiones exitosas \ n' # dile al usuario las buenas noticias
El comando jpg2png se puede ejecutar en un directorio completo lleno de imágenes JPEG con solo / home / username / bin / jpg2png * .jpg
Verosimilitud
Una característica clave de los scripts de shell es que la invocación de sus intérpretes se maneja como una característica central del sistema operativo. Entonces, en lugar de que el shell de un usuario solo pueda ejecutar scripts en el lenguaje de ese shell, o un script que solo tenga su directiva de intérprete manejada correctamente si se ejecutó desde un shell (ambas limitaciones en el manejo de scripts del shell Bourne temprano), Los scripts de shell los configura y ejecuta el propio sistema operativo. Un script de shell moderno no solo está en la misma base que los comandos del sistema, sino que muchos comandos del sistema son en realidad scripts de shell (o más generalmente, scripts, ya que algunos de ellos no son interpretados por un shell, sino por Perl , Python o algún otro idioma). Esto se extiende a la devolución de códigos de salida, como otras utilidades del sistema, para indicar el éxito o el fracaso, y permite llamarlos como componentes de programas más grandes, independientemente de cómo se implementen esas herramientas más grandes. [7] [8]
Al igual que los comandos del sistema estándar, los scripts de shell normalmente omiten cualquier tipo de extensión de nombre de archivo, a menos que estén destinados a ser leídos en un shell en ejecución a través de un mecanismo especial para este propósito (como sh 's " .
" o csh ' s source ). [9] [10]
Programación
Muchos shells modernos también proporcionan varias características que generalmente se encuentran solo 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 de shell tienen poco o ningún soporte para sistemas de mecanografía 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 de gráficos.
Otros lenguajes de secuencias de comandos
Se han introducido muchos lenguajes de scripting potentes para tareas que son demasiado grandes o complejas para ser manejadas cómodamente con scripts de shell ordinarios, pero para las cuales las ventajas de un script son deseables y la sobrecarga de desarrollo de un lenguaje de programación compilado y completo sería una desventaja. . La especificidad de lo que separa los lenguajes de scripting de los lenguajes de programación de alto nivel es una fuente frecuente de debate, pero, en términos generales, un lenguaje de scripting es aquel que requiere un intérprete.
Ciclo vital
Shell scripts sirven a menudo como una etapa inicial en el desarrollo de software, y están a menudo sujetos a la conversión posterior a una implementación subyacente diferente, más comúnmente de ser convertido en Perl , Python o C . La directiva del intérprete permite que los detalles de implementación se oculten completamente dentro del script, en lugar de exponerse como una extensión de nombre de archivo, y proporciona una reimplementación sin problemas en diferentes idiomas sin impacto en los usuarios finales.
Si bien los archivos con la extensión de archivo ".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. [11] [12]
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 usara 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 sencilla selección de programas o archivos, inicio rápido y depuración interactiva. Se puede utilizar un script de shell para proporcionar un enlace de secuenciación y toma de decisiones en torno a los programas existentes, y para los scripts de tamaño moderado, la ausencia de un paso de compilación es una ventaja. La ejecución interpretativa hace que sea fácil escribir código de depuración en un script y volver a ejecutarlo para detectar y corregir errores. Los usuarios no expertos pueden utilizar secuencias de comandos para adaptar el comportamiento de los programas, y las secuencias de comandos de shell proporcionan un alcance limitado para el multiprocesamiento.
Por otro lado, las secuencias de comandos de shell son propensas a errores costosos. Los errores de escritura inadvertidos como rm -rf * / (en lugar del rm -rf * / previsto ) son folklore en la comunidad Unix; un solo espacio extra 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 transformar cp y mv en armas peligrosas, y el mal uso de la > redirección puede borrar el contenido de un archivo. Esto se vuelve más problemático por el hecho de que muchos comandos de UNIX difieren en el nombre por una sola letra: cp , cd , dd , df , etc.
Otra desventaja significativa es la velocidad de ejecución lenta y la necesidad de iniciar un nuevo proceso para casi todos los comandos de shell ejecutados. Cuando se puede realizar el trabajo de un script configurando una canalización en la que los comandos de filtro eficientes realizan la mayor parte del trabajo, la ralentizació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ó que "es más fácil portar un shell que un script de shell". [ Esta cita necesita una cita ]
De manera similar, las secuencias de comandos más complejas pueden encontrarse con las limitaciones del propio lenguaje de secuencias de comandos de shell; los límites dificultan la escritura de código de calidad, y las extensiones de varios shells para mejorar los problemas con el lenguaje del shell original pueden empeorar los problemas. [13]
Muchas de las desventajas del uso de algunos lenguajes de secuencia de comandos se deben a fallas de diseño dentro de la sintaxis o implementación del lenguaje , y no son necesariamente impuestas por el uso de una línea de comandos basada en texto; hay una serie de shells que usan otros lenguajes de programación de shell o incluso lenguajes completos como Scsh (que usa Scheme ).
Secuencias de comandos de shell en otros sistemas operativos
El software de interoperabilidad como Cygwin , MKS Toolkit , Interix (que está disponible en Microsoft Windows Services para UNIX), Hamilton C shell , UWIN (AT&T Unix para Windows) y otros permiten que los programas de 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 versiones anteriores de MKS Toolkit para OS / 2. Al menos tres implementaciones DCL para sistemas operativos de tipo Windows, además de XLNT , un paquete de lenguaje de scripting de uso múltiple que se usa 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. [14]
Además de las herramientas mencionadas anteriormente, algunas funciones POSIX y OS / 2 se pueden utilizar con los subsistemas ambientales correspondientes de la serie de sistemas operativos Windows NT hasta Windows 2000 también. Un tercer subsistema de 16 bits a menudo llamado subsistema MS-DOS usa Command.com provisto con estos sistemas operativos para ejecutar los archivos por lotes de MS-DOS antes mencionados. [15]
Las alternativas de consola 4DOS , 4OS2 , FreeDOS , Peter Norton 's NDOS y 4NT / Take Command que agregan funcionalidad a los archivos por lotes de Windows NT cmd.exe, 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. ser agregado, con Rexx, Perl, Python, Ruby y Tcl con 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 secuencias de comandos pueden, por definición, ampliarse; por ejemplo, un sistema de tipo MS-DOS / Windows 95/98 y Windows NT permite que los programas de 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 de gráficos y se pueden usar para codificar funciones y procedimientos para scripts de shell que plantean un cuello de botella de velocidad (C, Fortran, lenguaje ensamblador, etc. son mucho más rápidos aún) y para agregar funcionalidad que no está disponible en el shell lenguaje como enchufes y otras funciones de conectividad, procesamiento de texto de alta resistencia, trabajo con números si el guión de llamada no tiene esas habilidades, código de autoescritura y modificación automática, técnicas como recursividad , acceso directo a 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 elementos tales como hojas de cálculo, bases de datos, programas de todo tipo que se pueden ejecutar, 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
- Código de pegamento
- Directiva de intérprete
- Símbolo de Shebang (#!)
- Shells de Unix
- Potencia Shell
- Host de secuencia de comandos de Windows
Referencias
- ^ Kernighan, Brian W .; Pike, Rob (1984), "3. Usando el Shell", El entorno de programación UNIX , Prentice Hall, Inc., p. 94, ISBN 0-13-937699-2,
La cáscara es en realidad un lenguaje de programación: tiene variables, bucles, toma de decisiones, y así sucesivamente.
- ^ Cáscaras de Unix por ejemplo, págs. 7-10,
- ↑ Programming Perl, 5th Edition, prefacio
- ^ "osh-manned.org" . manned.org . Consultado el 16 de enero de 2019 .
- ↑ a b Johnson, Chris (2009). [1] Pro Bash Programming: Scripting the Linux Shell , Apress, recuperado el 27 de septiembre de 2019. ISBN 9781430219989
- ^ "exec (3p) - Manual del programador POSIX" . Consultado el 24 de julio de 2020 .
- ^ Robbins, Arnold; Beebe, Nelson HF (16 de mayo de 2005). Secuencias de comandos clásicas de Shell: comandos ocultos que desbloquean el poder de Unix . O'Reilly Media, Inc. pág. 10. ISBN 9780596555269. Consultado el 7 de mayo de 2017 .
Cuando los dos primeros caracteres de un archivo son! #, El kernel escanea el resto de la línea en busca de la ruta completa del intérprete que se utilizará para ejecutar el programa.
- ^ Carling, M .; Degler, Stephen; Dennis, James (2000). Administración del sistema Linux . Sams Publishing. pag. 275. ISBN 9781562059347. Consultado el 7 de mayo de 2017 .
Cuando termina una función o un script de shell típico, puede devolver un número entero entre 0 y 255 para que su padre sepa si tuvo éxito (o, en algún caso, qué tipo de acción realizó).
- ^ 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 los scripts de shell, es preferible mantener un nombre de archivo sin extensión y dejar que un intérprete identifique el tipo mirando en shebang (#!).
- ^ Taylor, Dave; Perry, Brandon (16 de diciembre de 2016). Wicked Cool Shell Scripts, 2da 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 esto no es obligatorio.
- ^ Robbins, Arnold; Hannah, Elbert; Cordero, Linda (2008). Aprendiendo los editores vi y Vim . pag. 205. ISBN 9781449313258.
- ^ Easttom, Chuck (2012). Administración esencial de Linux: una guía completa para principiantes . pag. 228. ISBN 978-1435459571.
- ^ "Programación Csh considerada perjudicial" .
- ^ MSDN [ no es lo suficientemente específico para verificar ]
- ^ Kit de recursos de la estación de trabajo de Windows NT 4
enlaces externos
- 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 las secuencias de comandos de Shell (Apple)
- Qué tener en cuenta al escribir scripts de shell portátiles de Peter Seebach
- Libros de secuencias de comandos de Unix Shell gratuitos
- Principiantes / BashScripting , Ubuntu Linux