
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 , que se guardaría en el mismo directorio, y 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
Simple batch jobs are not unusual for isolated tasks, but using shell loops, tests, and variables provides much more flexibility to users. A POSIX sh script to convert JPEG images to PNG images, where the image names are provided on the command-line—possibly via wildcards—instead of each being listed within the script, can be created with this file, typically saved in a file like /home/username/bin/jpg2png
#!/bin/shforjpg;do# use $jpg in place of each filename given, in turnpng=${jpg%.jpg}.png# construct the PNG version of the filename by replacing .jpg with .pngprintf'converting "%s" ...\n'"$jpg"# output status info to the user running the scriptifconvert"$jpg"jpg.to.png;then# use convert (provided by ImageMagick) to create the PNG in a temp filemvjpg.to.png"$png"# if it worked, rename the temporary PNG image to the correct nameelse# ...otherwise complain and exit from the scriptprintf>&2'jpg2png: error: failed output saved in "jpg.to.png".\n'exit1fi# the end of the "if" test constructdone# the end of the "for" loopprintf'all conversions successful\n'# tell the user the good newsThe jpg2png command can then be run on an entire directory full of JPEG images with just /home/username/bin/jpg2png *.jpg
Programming
Many modern shells also supply various features usually found only in more sophisticated general-purpose programming languages, such as control-flow constructs, variables, comments, arrays, subroutines and so on. With these sorts of features available, it is possible to write reasonably sophisticated applications as shell scripts. However, they are still limited by the fact that most shell languages have little or no support for data typing systems, classes, threading, complex math, and other common full language features, and are also generally much slower than compiled code or interpreted languages written with speed as a performance goal.
The standard Unix tools sed and awk provide extra capabilities for shell programming; Perl can also be embedded in shell scripts as can other scripting languages like Tcl.[5] Perl and Tcl come with graphics toolkits as well.
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:
- Caparazón Z (
zsh) - Nushell (
nu) - xonsh shell (
xonsh), pronunciado "conch", un intérprete de comandos basado en Python - PowerShell (
pwsh)
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:
- shell antiguo (
osh), una "adaptación del intérprete de comandos estándar de la sexta edición de UNIX" [ 13 ] - KornShell (
ksh), ya que fue reemplazado en gran medida por su sucesor, el shell Z. - Tenex C Shell (
tcsh) y su predecesor, el C shell (csh)
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
- una consola remota (
rsh) - un Secure Shell (
ssh)
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 ]
Many disadvantages of using some script languages are caused by design flaws within the language syntax or implementation, and are not necessarily imposed by the use of a text-based command-line; there are a number of shells which use other shell programming languages or even full-fledged languages like Scsh (which uses Scheme).
Interoperability among scripting languages
Many scripting languages share similar syntax and features due to their adherence to the POSIX standard, and several shells provide modes to emulate or maintain compatibility with others. This allows scripts written for one shell to often run in another with minimal changes.
For example, Bash supports much of the original Bourne shell syntax and offers a POSIX-compliant mode to improve portability. However, Bash also includes a number of extensions not found in POSIX, commonly referred to as bashisms. While these features enhance scripting capabilities, they may reduce compatibility with other shells like Dash or ksh.
Shell scripting on other operating systems
Interoperability software such as Cygwin, the MKS Toolkit, Interix (formerly part of Microsoft Windows Services for UNIX), Hamilton C shell, and UWIN (AT&T Unix for Windows) enables Unix shell programs to run on Windows NT-based systems, though some features may not be fully supported on the older MS-DOS/Windows 95 platforms. Earlier versions of the MKS Toolkit also provided support for 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
- ↑ 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.
- ↑ Arnold Robbins y Nelson HF Beebe (2005). Classic Shell Scripting . O'Reilly Media. pág. 5. ISBN 978-0-596-00595-5.
- 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 .
- ↑ "exec(3p) – Manual del programador POSIX" . Consultado el 24 de julio de 2020 .
- ↑ Stephen G. Kochan, Patrick H. Wood (2003). Programación de shell de Unix . Sams Publishing. pág. 243. ISBN 9780672324901.
- ↑ https://linuxhandbook.com/dash-shell/
- ↑ https://www.terminal.guide/shell/dash/
- ↑ https://www.gnu.org/software/bash/
- ↑ https://busybox.net/
- ↑ https://waitwhat.sh/blog/the_case_for_fish/
- ↑ Shells de Unix por ejemplo, págs. 7-10,
- ↑ Wall, Larry; Christiansen, Tom; Orwant, Jon (2012). Programación en Perl (5.ª ed.). O'Reilly Media. p. Prefacio. ISBN 9781449303587.
- ↑ "osh - manned.org" . manned.org . Consultado el 16 de enero de 2019 .
- ↑ Flanagan, David (2020). JavaScript: La guía definitiva . O'Reilly Media. pág. 2. ISBN 9781491952023.
- ↑ Harold, Elliotte Rusty (2013). Programación de redes Java . O'Reilly Media. pág. 6. ISBN 9781449365943.
- ↑ 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.
- ↑ Robbins, Arnold; Hannah, Elbert; Lamb, Linda (2008). Aprendiendo a usar los editores vi y Vim . O'Reilly Media, Inc. pág. 205. ISBN 9781449313258.
- ↑ Easttom, Chuck (2012). Administración esencial de Linux: una guía completa para principiantes . Course Technology/Cengage Learning. pág. 228. ISBN 978-1435459571.
- ↑ 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(#!).
- ↑ 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.
- ↑ Shotts, William (2019). La línea de comandos de Linux . No Starch Press. pág. 72. ISBN 9781593279523.
- ^ Albing, Carl; Vossen, JP; Newham, Cameron (2007). Libro de cocina Bash . Medios O'Reilly. pag. 53.ISBN 9780596526788.
- ↑ Larry Wall (4 de enero de 1991). "Encontrando el último argumento" . Grupo de noticias : comp.unix.shell . Consultado el 5 de enero de 2023 .
- ↑ Christiansen, Tom. "La programación en Csh se considera perjudicial" .
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 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
- Lenguajes de scripting
- Software Unix