Proyectiles de comando. Lección uno. shell de comandos UNIX

Intérprete de comandos

Para proporcionar una interfaz de línea de comandos, el sistema operativo suele utilizar intérpretes de comandos, que pueden ser lenguajes de programación independientes con su propia sintaxis y funcionalidad distintiva.

El sistema operativo Windows 9x incluye el intérprete de comandos command.com, y Windows NT incluye los shells de comandos UNIX, los populares csh, ksh y otros.

Normalmente, cuando se realiza un ajuste de bajo nivel en un sistema operativo, el usuario tiene la posibilidad de cambiar el shell predeterminado.

Funciones

El intérprete de comandos ejecuta comandos en su idioma, dados en la línea de comandos o provenientes de una entrada estándar o un archivo .

Las llamadas a utilidades del sistema o de aplicaciones, así como a estructuras de control, se interpretan como comandos. Además, el shell es responsable de expandir los patrones de nombres de archivos y de redirigir y vincular la E/S de la utilidad.

Junto con un conjunto de utilidades, el shell es un entorno operativo, un lenguaje de programación completo y una herramienta poderosa para resolver problemas tanto del sistema como de algunas aplicaciones, especialmente la automatización de secuencias de comandos ejecutadas con frecuencia.

Intérprete de comandos estándar

Implementaciones y disponibilidad

Alternativas

Junto con los estándar, los sistemas operativos abiertos también utilizan shells tcsh alternativos, que se diferencian en la sintaxis de las construcciones de control y el comportamiento de las variables.

Algunos sistemas operativos alternativos vienen con intérpretes de sus propios lenguajes de archivos de comandos (como el lenguaje de archivos de comandos de Microsoft Windows NT, el idioma OS/2, etc.)

Algunas personas prefieren utilizar nuevos lenguajes interpretados, como Python, para automatizar secuencias de comandos ejecutadas con frecuencia.

Concha gráfica

Shells gráficos para OS Windows.

Las últimas versiones del sistema operativo Windows utilizan el entorno integrado del Explorador de Windows como shell. Windows Explorer es un entorno de administración visual que incluye el escritorio, el menú Inicio, la barra de tareas y las funciones de administración de archivos. Las primeras versiones del sistema operativo Windows 3.xx incluían un administrador de programas como shell gráfico.

Muchos desarrolladores externos ofrecen entornos alternativos que se pueden utilizar en lugar del shell Explorer que Microsoft incluye de forma predeterminada en Windows.

  • concha de aston
  • BB4Win
  • BBlean
  • El Cairo (en desarrollo)
  • croma
  • Emerger escritorio
  • Geoshell
  • Navegador Packard Bell
  • Gerente de Programa
  • Escritorio seguro
  • SharpE
  • Escritorio talismán
  • WinStep
  • microsoft bob

Ver también

Fundación Wikimedia.

2010.

    Vea qué es "Command Shell" en otros diccionarios:

    - (shell Unix en inglés, a menudo simplemente "shell" o "sh") un intérprete de comandos utilizado en los sistemas operativos de la familia UNIX, en el que el usuario ... Wikipedia

    Este término tiene otros significados, consulte Deseo. Wish (Windowing Shell) es un shell de comandos UNIX interactivo o programable para X Window System y Mac OS X. Proporciona a los usuarios control sobre los componentes... ... Wikipedia

    - ...Wikipedia

    La solicitud del intérprete de línea de comandos se redirige aquí. Se necesita un artículo aparte sobre el tema "Intérprete de línea de comandos". Aspecto del caparazón (inglés Co ... Wikipedia

    El shell del sistema operativo (del inglés shell shell) es un intérprete de comandos del sistema operativo (SO) que proporciona una interfaz para la interacción del usuario con las funciones del sistema. En general, existen shells con dos tipos de interfaz para ... Wikipedia

    El shell del sistema operativo (del inglés shell shell) es un intérprete de comandos del sistema operativo (SO) que proporciona una interfaz para la interacción del usuario con las funciones del sistema. En general, existen shells con dos tipos de interfaz para ... Wikipedia

    El shell del sistema operativo (del inglés shell shell) es un intérprete de comandos del sistema operativo (SO) que proporciona una interfaz para la interacción del usuario con las funciones del sistema. En general, existen shells con dos tipos de interfaz para ... Wikipedia

Shell de comandos UNIX (shell Unix en inglés, a menudo simplemente “shell” o “sh”) un intérprete de comandos utilizado en sistemas operativos de la familia POSIX de shells compatibles, que se remonta al shell Bourne, que apareció en la versión 7 de Unix. Contenido 1. ... ...Wikipedia

  • Libros

Guiones de shell. Linux, OS X y Unix. Guía, Taylor Dave. Los scripts de Shell han ayudado a los administradores de sistemas y programadores a automatizar tareas rutinarias desde los albores de las computadoras. Desde el lanzamiento del primer...

Esta sección proporciona documentación para ayudar al programador en los lenguajes de shell de comandos (sh, bash, ksh y otros).

intérprete de comandos c-shell

0. Introducción

El intérprete de comandos en el entorno UNIX realiza dos funciones principales:
representa una interfaz interactiva con el usuario, es decir emite un mensaje y procesa los comandos ingresados ​​por el usuario;

En este último caso, el sistema operativo permite que los archivos por lotes sean tratados como un tipo de archivo ejecutable. En consecuencia, existen dos modos de funcionamiento del intérprete: interactivo y de comando.

UNIX (a diferencia de, digamos, DOS) tiene varios intérpretes de comandos diferentes. Enumeremos los más populares:

/bin/sh - shell Bourne. Históricamente, es el primer shell de comandos desarrollado para la primera versión del sistema operativo UNIX. Actualmente, este shell es el shell principal en las versiones de UNIX System V.
/bin/csh - C-shell. Un shell cuya sintaxis del lenguaje de comandos es similar al lenguaje C. Es el shell principal de la versión Berkeley del sistema operativo UNIX.
/bin/ksh - k-shell.
/bin/rsh - Shell restringido. Es un software con capacidades limitadas (principalmente para proteger el sistema operativo de acciones de usuarios no autorizados).

El sistema operativo ConvexOS es una versión de 4.3 BSD UNIX()BSD - Distribución de la serie Berkeley y, por lo tanto, el shell base es csh.

1. Características principales

Trabajar con la línea de comando

El intérprete percibe la cadena escrita por el usuario como un comando (o varios comandos). La sintaxis del shell le permite escribir

varios comandos en una línea, separados por punto y coma. Por ejemplo

es equivalente a dos comandos ingresados ​​secuencialmente:

Por el contrario, si lo desea, el usuario puede

continúe escribiendo el comando largo en la siguiente línea y finalice la línea actual con \\. Hasta que se complete el comando, recibirá un "mensaje secundario" > en lugar del primario (%). Por ejemplo,

% tar tv Makefile star.o star.c star.dat main.o main.c

equivalente

%tar tv Makefile estrella.o\

> estrella.c estrella.dat \

Los flujos de E/S se controlan de forma similar a DOS (más precisamente, el sistema operativo DOS adoptó la sintaxis de redirección de subprocesos de UNIX) utilizando los símbolos > , > > ,

Un caso especial útil de uso del mecanismo de redirección de hilos es redirigir a /dev/null, lo que le permite deshacerse de mensajes innecesarios en la pantalla. Usando el mismo mecanismo, puedes crear archivos vacíos:

creará un archivo vacío myfile en el directorio actual.

Además, C-shell le permite agrupar comandos usando paréntesis. En este caso, el intérprete considera toda la construcción dentro de los corchetes como un comando. Esto es útil, por ejemplo, en tales construcciones:

% (comando1 | comando2)

Si omite los paréntesis, el shell no podrá determinar qué comando desea ingresar en el archivo myfile.

Existen las siguientes "comodidades" en esta implementación de C-shell:

Puede evitar escribir un comando largo hasta el final, pero intente presionar la tecla tab después de escribir parcialmente el comando (o el nombre del archivo). C-shell intentará completar los caracteres que faltan por sí mismo o responderá con un chillido si la elección es ambigua.
Si escribió un comando pero olvidó sus opciones, escriba la secuencia H. C-shell le brindará una breve ayuda. Por ejemplo,

Al escribir el nombre completo del archivo, utilice la combinación de teclas ^D. Podrá obtener una lista del directorio que está escribiendo en el formato del comando lf.
El búfer de comandos recuerda los últimos 20 comandos. En lugar de escribir un comando, puede llamarlo desde el búfer usando el teclado de flechas (por supuesto, solo si este comando está en el búfer).

Análisis de línea de comando

El intérprete, al recibir la línea de comando, realiza una serie de transformaciones en ella, a saber:

Expande alias
Expande metacaracteres (*, ?, [, ], ~, (, ))
Sustituye variables de shell
Ejecuta el comando si es un comando de intérprete integrado o inicia un proceso si el comando es externo.

Veamos estos pasos paso a paso.

Alias. El comando de alias incorporado le permite definir alias de comando. Ejemplo:

% alias mycat "gato | más"

define mycat como alias para la cadena cat | más. Por lo tanto, además tiene derecho a utilizar el comando mycat, que el intérprete ampliará dondequiera que lo utilice. Ésta es una forma de definir nombres cortos para comandos compuestos largos.

El comando incorporado unalias mycat destruye el alias mycat ingresado previamente.

Metacaracteres. Los metacaracteres le permiten acortar listas enteras de palabras (principalmente nombres de archivos). Shell trata una palabra que contiene metacaracteres como una plantilla para compilar una lista de nombres de archivos:

* en la plantilla reemplaza cualquier secuencia de caracteres. Por ejemplo, m* se expandirá a una lista de todos los archivos que comienzan con la letra m. Hay una pequeña excepción a esta regla: simplemente * omite de la lista aquellos archivos cuyos nombres comienzan con un punto.
? reemplaza un carácter. Por ejemplo m? se expandirá a una lista de todos los nombres de archivos que comienzan con la letra m y que constan exactamente de dos letras.
[.-.] le permite especificar el intervalo para el carácter sustituido. Por ejemplo, m se expandirá a ma mb mc me.
(...,...) le permite enumerar palabras para sustitución. Entonces, por ejemplo, m(rojo,azul,verde) se expandirá a mred mblue mgreen.

Finalmente, la tilde le permite especificar el directorio de inicio del usuario:

~nombre/ equivale a especificar la ruta completa al directorio de inicio del nombre de usuario (por ejemplo, /usr1/nombre/)
~/ equivale a especificar la ruta completa a su propio directorio personal.

Variables del caparazón. El intérprete de comandos interpreta las palabras que comienzan con el símbolo $ como nombres de variables. Las variables se dividen en variables de entorno (serán conocidas por todos los programas llamados desde este shell y, en este sentido, son globales) y variables simples.

El comando incorporado set name=value le permite definir una variable simple llamada nombre y darle el valor valor. Cuando el intérprete encuentre la expresión $nombre en la línea de comando, la reemplazará con valor. Por ejemplo,

% establecer color = azul

mostrará la línea azul en el terminal. A

% establecer color = azul

% eco nuevo$color

le dará nuevo azul. Finalmente, al ingresar

% establecer color = azul

% eco $(color)nuevo

obtenemos color nuevo. El último ejemplo demuestra cómo usar llaves para separar el nombre de una variable de una palabra (para hacer eco de $colornew, el intérprete respondería que la variable colornew no está definida.

El comando unset destruye las variables previamente definidas.

Para definir una variable igual a una cadena de varias palabras, enciérrela entre comillas simples. Ejemplo

% set color="azul o rojo o verde"

Las variables simples pueden ser matrices de palabras (lo que debe distinguirse del caso que acabamos de comentar, cuando la variable contiene una cadena de varias palabras. Para declarar una matriz, debe utilizar paréntesis:

% establecer colores=(azul rojo verde)

Ahora echo $colors producirá una cadena de tres colores (¡pruébalo!). Sin embargo, también puedes trabajar con elementos de matriz individuales (los elementos están numerados comenzando desde cero), así:

(nos ponemos verdes). El número de elementos de la matriz está contenido en la variable $#colors.

Le dará el número 3 a la terminal.

Son posibles combinaciones bastante complejas utilizando plantillas, por ejemplo:

% establecer archivos=(m*)

devolverá el número de archivos en el directorio actual comenzando con la letra m.

Las variables de entorno se llaman de la misma manera que las variables simples. La diferencia radica en la forma en que se definen:

El comando % setenv name value establece una variable de entorno llamada nombre. Tenga en cuenta la molesta diferencia en la sintaxis: al definir una variable de entorno, no es necesario utilizar el signo =.

Se puede obtener una lista de todas las variables de entorno utilizando el comando integrado printenv.

Puede anular la definición de una variable de entorno utilizando unsetenv.

Finalmente, para definir una matriz de variables de entorno, NO use paréntesis, sino dos puntos como delimitadores de elementos de la matriz:

% setenv MANPATH /usr/man/:/usr/local/man:/usr/man/X11:~/man

Comandos y variables integrados

Lista de los comandos integrados de C-Shell más importantes con breves explicaciones:

alias define un alias

bg transfiere la tarea al modo de ejecución en segundo plano

Comando chdir path para ir al directorio de ruta.

echo imprime todos sus argumentos en la salida estándar

exec filename inicia el proceso desde el archivo filename en lugar del shell actual (es decir, encima de él). No es posible volver al caparazón.

exit finaliza el shell.

fg hace que un proceso en segundo plano sea sincrónico.

El nombre del archivo proporciona información sobre lo que piensa el sistema operativo sobre este archivo.

goto label salta incondicionalmente a la línea en el archivo de comando marcada con etiqueta. No se utiliza de forma interactiva.

kill pid envía una señal de cancelación al proceso pid, lo que generalmente resulta en la muerte del proceso.

nombre de archivo fuente lee y ejecuta comandos desde el nombre de archivo.

set, setenv configurando variables internas y de entorno.

shift var desplaza los elementos de la matriz var hacia la izquierda. En este caso, el tamaño de la matriz se reduce en uno y se pierde el elemento cero de la matriz. La variable var debe ser una matriz.

El comando time ejecuta el comando y muestra el tiempo que tardó en ejecutarse en el terminal.

unset destruye la variable de shell.

unalias destruye un alias de comando previamente definido.

@name=expr almacena el resultado de la expresión aritmética expr en la variable de nombre.

Lista de las variables integradas de C-Shell más importantes con breves explicaciones:

matriz argv de parámetros de línea de comando (usada en modo comando)

cdpath es el directorio donde va el shell cuando se le da el comando chdir sin argumento.

Tamaño del búfer histórico para almacenar comandos.

directorio de inicio del usuario doméstico

ubicación del correo en el sistema de archivos del buzón del usuario.

ruta ruta para buscar comandos externos.

El indicador es el indicador principal del shell.

mensaje1 mensaje secundario.

ruta completa del shell del archivo ejecutable del shell actual (/bin/csh)

Declaraciones de control y declaraciones de bucle

De la lista de elementos integrados del shell, hemos excluido deliberadamente las declaraciones condicionales y de bucle, que se analizarán aquí.

Ejecución condicional

La sintaxis de la declaración condicional if en C-shell es:

comando si (expr)

expr puede ser una expresión aritmética o una verificación de los atributos del archivo. Ejemplo:

si (-f /etc/hosts) cat /etc/hosts

Consideremos el último caso con más detalle. Son posibles las siguientes comprobaciones de atributos de archivo:

R es legible

W está disponible para grabar.

X está disponible para su ejecución.

E comprobando la existencia del archivo

O comprueba que eres el propietario de este archivo.

El archivo Z tiene tamaño cero

El archivo F es un archivo normal

El archivo P es una tubería con nombre

El archivo D es un directorio

mientras bucle

El bucle se ejecuta mientras la condición sea verdadera. Ejemplo:

mientras ($#archivos > 0)

bucle foreach

Este es un operador extremadamente útil que le permite recorrer los elementos de una matriz de palabras.

foreach varname (lista)

El cuerpo del bucle se ejecuta tantas veces como elementos haya en la matriz de lista. En este caso, la variable varname contiene el siguiente valor del elemento de la matriz. Ejemplo

color foreach (azul rojo verde)

echo El color es $color

archivo foreach (*.for)

echo Cambiando el nombre del archivo $

mv $archivo `nombrebase $archivo .for`.f

Esto utiliza el comando basename estándar, que "corta" el sufijo dado por el segundo argumento de la palabra dada en el primer argumento e imprime la palabra resultante en la salida estándar. El uso de comillas inversas en el lenguaje C-shell se analizará un poco más adelante.

Operador condicional multivariante

La sintaxis de una declaración de cambio condicional en C-shell es:

patrón de caso1: ... rompew caso (\it patrón2):

El operador permite que el control se transfiera dependiendo de si la cadena satisface algún patrón del conjunto patrón1, patrón2,... (en cuyo caso el control se transfiere al bloque delimitado por caso... breaksw) o no (en cuyo caso el control se transferido a la rama predeterminada:... endsw. En general, la declaración de cambio es muy similar a un operador similar en el lenguaje C. Estas construcciones se usan a menudo en archivos por lotes para analizar la respuesta del usuario a una pregunta determinada ().

2. Ejecutar el shell en modo comando

Ya se ha señalado que csh se puede iniciar en modo comando. Además, las declaraciones condicionales y las declaraciones de bucle se utilizan con mayor frecuencia en archivos por lotes. Aquí veremos las características de este trabajo en "equipo".

Identificación del intérprete

La forma más sencilla de iniciar el shell en el modo de ejecución de un determinado archivo mycommand es darle a este archivo el atributo ejecutable con el comando chmod:

% chmod +x micomando

Ahora sólo necesita ingresar el comando mycommand desde el teclado y el sistema operativo iniciará automáticamente el shell en modo comando para ejecutar este archivo. Hay un problema en este camino: hay muchos intérpretes de comandos en el sistema y su sintaxis de comandos es diferente. ¿Cómo determinará el sistema operativo cuál necesita? La respuesta es no. Debe indicarle explícitamente al sistema operativo qué intérprete desea ejecutar para ejecutar este archivo por lotes. Para hacer esto, la primera línea de su archivo debe tener el siguiente formato estándar:

lo que permitirá que el sistema operativo haga lo correcto. Si no especifica esta información, el sistema operativo asumirá (por razones históricas) que el archivo está escrito en el lenguaje shell Bourne y lo más probable es que reciba muchos mensajes de error de sintaxis.

Observemos una propiedad más útil del shell que funciona en modo comando: todas las líneas que comienzan con el signo # serán ignoradas. Esto le permite agregar comentarios al texto del archivo de comando.

El siguiente hecho le permite trabajar con la línea de comando usando csh: cuando ejecuta el archivo de comando, mycommand, se define automáticamente una variable interna llamada argv, que representa una matriz de parámetros de la línea de comando. Por ejemplo, el siguiente archivo por lotes simplemente imprime todos sus argumentos y su número en la terminal:

# Este archivo simplemente genera sus argumentos

# y el número total de argumentos

echo Argumentos: $argv

echo Número de argumentos: $#argv

Lanzamiento explícito

Puede utilizar una forma más directa, pero menos conveniente, de ejecutar un archivo por lotes: llamando al shell con el parámetro -c de nombre de archivo. Ejemplo:

% /bin/csh -c micomando arg1 arg2 arg3...

donde la clave debe ir seguida inmediatamente del nombre del archivo a iniciar. Los argumentos requeridos se enumeran a continuación. Tenga en cuenta que con este método de inicio, es posible que el archivo no tenga un atributo ejecutable.

Citas

Las comillas juegan un papel importante en la sintaxis del shell. Hay tres tipos de comillas: simples ("), dobles (") y comillas invertidas (`).

Las comillas simples se utilizan para resaltar el texto que el shell debe interpretar literalmente. En otras palabras, el texto entre comillas simples no está sujeto a ampliación e interpretación. Ejemplo:

echo "El dólar es bueno"

literalmente obtenemos que Dólar es $bueno a pesar de que el signo de dólar es un metacarácter de shell.

Las comillas dobles delimitan una cadena de caracteres que el shell tratará como una sola palabra. Ejemplo:

establecer colores="verde azul rojo"; eco $#colores

devolverá el número 1, lo que significa que la variable colores es una variable simple y no una matriz. Todo lo que esté entre comillas dobles está sujeto a interpretación por parte del shell.

Las comillas inversas le permiten representar una cadena que consta del resultado de un comando. Entonces, la expresión entre comillas invertidas se trata como un comando que ejecuta el shell, y lo que este comando imprime en la salida estándar se sustituye como una cadena en el lugar donde aparecen esas comillas invertidas. Ejemplo:

pondrá en la variable mytty la cadena que produce el comando tty (es decir, el nombre y el número de la terminal actual).

Shell de comando en UNIX es una interfaz de línea de comandos en sistemas operativos tipo Unix, es decir, ejecuta comandos dados por el usuario o que se leen de archivos. Dichos archivos con comandos de shell se denominan scripts de shell (scripts, programas). Estos scripts no se compilan, sino que el shell los interpreta. Esto significa que el shell lee el script de principio a fin, línea por línea, busca los comandos allí especificados y los ejecuta; A diferencia de este enfoque, el compilador convierte todo el programa en un formato adecuado para la ejecución automática; el archivo con este código se puede utilizar luego en un script de shell. Un rasgo característico del lenguaje shell es que muchas operaciones integradas en los lenguajes de programación tradicionales se realizan llamando a programas externos.

Uno de los propósitos del shell es proporcionar un entorno de usuario que pueda personalizarse mediante archivos de configuración.

tipos de conchas

UNIX proporciona varios shells diferentes para elegir:

sh, o shell Bourne ( Concha Bourne) uno de los primeros shells que se utilizaron en entornos tipo UNIX. Este es un shell básico, pequeño y con un pequeño conjunto de capacidades. Es el shell estándar de facto y está presente en todos los sistemas UNIX. En Linux, /bin/sh puede ser un enlace simbólico a bash. Esto se hace para garantizar la compatibilidad con las aplicaciones UNIX. intento, o el nuevo shell Bourne ( Bourne otra vez Shell) shell estándar de Linux. La mayoría de los usuarios de Linux tienen instalado el shell predeterminado intento. En sentido intento- este es un complemento de sh, un conjunto de complementos y módulos adicionales. Por lo tanto, el nuevo shell Bourne es compatible con el shell Bourne normal: comandos que se ejecutan en sh, trabajará en intento, pero no necesariamente al revés. csh, o shell orientado a C ( Concha C) la sintaxis de este shell es similar al lenguaje de programación C. Normalmente, los programadores utilizan este shell. tcsh, o un contenedor mejorado orientado a C ( Carcasa Turbo C) superestructura sobre csh. ksh, o cáscara de Korn ( Concha de Korn) Fue escrito a principios de la década de 1980 y recibió las mejores características de Bourne Shell y CSH en ese momento. Es un complemento para Bourne Shell y garantiza la ejecución de scripts escritos para Bourne Shell. El estándar POSIX es un shell Korn de capacidad limitada.

El archivo /etc/shells contiene información sobre los shells presentes en el sistema:

Mia: ~> gato /etc/shells /Bin/bash /Bin/sh /Bin/tcsh /Bin/csh

El shell de usuario se instala en el archivo /etc/passwd. Por ejemplo, cadena de usuario desaparecido en combate que tiene un caparazón instalado intento :

Mia: L2NOfqdlPrHwE: 504:504: Mia Maya:/home/mia:/bin/bash

Cambiar entre conchas

El usuario puede iniciar otro shell en cualquier momento. Por ejemplo, si por defecto funciona bajo los controles intento, y es más conveniente para él realizar algunas acciones bajo el caparazón csh, lanza este shell

Mía:~>csh

Para volver al control intento necesitas escribir salir.

Seguramente casi todos los lectores de Habr conocen los shells sh y bash. Además, la mayoría de nosotros hemos oído algo sobre zsh y tcsh. Sin embargo, la lista de shells existentes no termina ahí. Se pueden dividir a grandes rasgos en tres grupos:

  • Clones de shell Bourne (bash, zsh)
  • C shell (csh, tcsh)
  • Basado en lenguajes de programación populares (psh, ipython, scsh)
  • Exótico, específico y todo lo demás.
Se discutirán los más interesantes de ellos.

El propósito de escribir este artículo no fue revisar o clasificar todos los shells de comandos existentes. Sólo quiero hablar sobre algunos productos interesantes en esta área y ampliar los horizontes del lector. Me alegraré. Si esto anima a alguien a estudiar el tema con más detalle o incluso pasar a otro tema.
Primero, brevemente sobre qué es. Un shell de comandos o intérprete de comandos es una aplicación que proporciona al usuario una interfaz de línea de comandos en la que el usuario ingresa comandos individualmente o ejecuta scripts que constan de una lista de comandos. Oralmente y en textos no oficiales a menudo se le llama "shell", del inglés shell - shell.

Los shells compatibles con POSIX más utilizados descienden del shell Bourne, así que comenzaremos con eso.

Bourne Shell y sus clones.

concha de bourne, archivo ejecutable: sh. Un shell de comandos que lleva el nombre de su creador, Stephen Bourne. La mayoría de los operadores fueron tomados del lenguaje ALGOL 68. Fue lanzado en la séptima edición del sistema operativo UNIX, donde era el shell predeterminado. Hasta el día de hoy, la gran mayoría de sistemas tipo Unix tienen /bin/sh, un enlace físico o simbólico a un shell compatible con sh.

Bourne Shell otra vez, archivo ejecutable: intento. El título puede traducirse como “El paseo renacido de Bourne”. Probablemente el caparazón más popular en la actualidad. Estándar de facto para Linux. No me detendré en ello, porque... Hay muchos buenos artículos sobre bash en Internet. Por ejemplo aquí y aquí.

concha Z, archivo ejecutable: zsh. Un shell gratuito y moderno compatible con SH. Tiene una serie de ventajas sobre bash, principalmente relacionadas con el trabajo en modo interactivo. Escribieron sobre ello en Habré y
Además, hay bastantes conchas que entran en este grupo: conchas Korn (ksh) y conchas Almquist (ash), etc., pero no nos detendremos en ellas en detalle.

caparazón C

caparazón C, archivo ejecutable: csh Un shell de comando desarrollado por el autor de vi Bill Joy. La base del lenguaje de programación csh fue, como su nombre indica, el lenguaje C. en aquel momento, en 1978, era el lenguaje de programación más popular entre los desarrolladores y usuarios de BSD UNIX. Actualmente, la implementación gratuita más popular de csh es tcsh.

Carcasa TENEX C, archivo ejecutable: tcsh. Fue en tcsh donde apareció por primera vez el autocompletado. Este es el shell predeterminado en FreeBSD. Puedes leer más al respecto.
Para mostrar claramente la diferencia en la sintaxis, daré varios ejemplos de scripts que hacen lo mismo para csh y un intérprete de comandos compatible con sh.

Construcción condicional:

Un bucle que calcula las primeras 10 potencias de dos:

#!/bin/sh i=2 j=1 mientras [ $j -le 10 ]; hacer echo "2 **" $j = $i i=`expr $i "*" 2` j=`expr $j + 1` hecho #!/bin/csh establecer i = 2 establecer j = 1 mientras ($j<= 10) echo "2 **" $j = $i @ i *= 2 @ j++ end

Sin embargo, la lista de características admitidas por las últimas versiones de bash, zsh y tcsh es muy similar y la elección de un shell específico es principalmente una cuestión de gustos. Con conchas menos comunes la situación es diferente. Aquí las diferencias son más significativas.

Shells de comandos basados ​​en lenguajes de programación populares.

Shell Perl, archivo ejecutable: psh. Un shell que combina las características de los shells anteriores y el poder del lenguaje Perl. Porque psh está escrito en perl e incluso puede ejecutarse en Windows. Algunos ejemplos de uso de psh:
ls | s/y/k/ # Reemplazo usando expresiones regulares ls | ( print ++$i, ": $_"; )q # Filtro rápido. Dentro de las llaves hay una expresión Perl donde $_ contiene una línea de salida.

netstat | ( $_>2; )g # filtros grep. Solo se imprimen aquellas líneas para las cuales la expresión entre paréntesis devuelve verdadero comando >[=FOO] # Redirigir a un descriptor de archivo abierto comando > archivo # Equivalente al comando 2> archivo en bash. Redirige la salida y el flujo de error a un archivo grep foo lib/**/*.pm # Use **, que significa el directorio actual y todos los subdirectorios scsh , archivo ejecutable scsh
. Un intérprete de comandos de código abierto que utiliza el Esquema 48 como lenguaje de secuencias de comandos. No admite funciones estándar para otros shells (historial de comandos, edición de texto en la línea de comandos, adición de rutas/comandos). Se recomienda el uso de scripts, pero no para trabajos interactivos. Puede atraer a los fanáticos de la programación funcional. A continuación se muestra un ejemplo de un script que muestra los nombres de todos los archivos ejecutables ubicados en directorios de la variable de entorno PATH.

#!/usr/local/bin/scsh -s !# (definir (directorio de ejecutables) (con-cwd dir (filtrar archivo-ejecutable? (directorio-archivos dir #t)))) (definir (writeln x) (mostrar x) (nueva línea)) (para cada escritura (ejecutables de mapa adjunto ((infix-splitter ":") (getenv "RUTA")))) IPython
. Es un shell interactivo para el lenguaje de programación Python que tiene una serie de características adicionales. IPython tiene un perfil especial para ejecutarse como shell del sistema. La forma de iniciar este modo depende, según tengo entendido, de la versión, pero en mi máquina se ve así:

ipython3 --perfil=pysh

  • Ya se ha escrito bastante sobre IPython, incluso en ruso (enlaces al final del artículo). Intentaré enumerar sus características principales desde el punto de vista de su uso como shell de comandos:
  • Multiplataforma. Incluso existe una versión para Windows.
  • Versiones de Python 2.x o 3.x como lenguaje de programación, capacidades de introspección mejoradas
  • Autocompletado de código Python, así como nombres de archivos y comandos del sistema.
  • Historial de comandos y macros basadas en él.
Un mecanismo que agiliza la navegación por catálogos, marcadores y mucho más
# Digamos que queremos calcular el tamaño total de los archivos de registro dpkg: Entrada: cd /var/log/ /var/log Entrada: log_files = !ls -l dpkg.log* Entrada: log_files Salida: "-rw-r- -r-- 1 raíz raíz 1824 3 de noviembre 16:41 dpkg.log" Entrada: para línea en log_files: ....: tamaño += int(line.split()) ....: Entrada: tamaño Salida: 1330009 # ..o hacer ping secuencialmente a diez hosts In: for i in range(100,110): ....: !ping -c 1 192.168.0.$i ....:
Descansar
Por supuesto, esta no es una lista completa ni siquiera de los caparazones más populares. Además de las categorías anteriores, también existen aquellas que utilizan su propia sintaxis, que no es compatible con sh y no copia el lenguaje existente. Un ejemplo sería el amigable caparazón interactivo (pez). Pero, por último, no me gustaría hablar de eso, sino de un Sleepshell más específico.

Chupete para dormir, archivo ejecutable: sueño. Estrictamente hablando, a Sleepshell no se le puede llamar procesador de comandos, porque no puede procesar comandos. Y, en general, no puede hacer nada excepto escribir periódicamente asteriscos "*" en la salida estándar. Sin embargo, se usa precisamente como shell de comandos y por esta razón: Digamos que queremos darle a alguien la oportunidad de hacer túneles ssh a través de nuestro servidor ejecutando Linux o Unix. Lea más sobre los túneles ssh. Pero no necesitamos que alguien tenga acceso a la línea de comandos y al sistema de archivos de nuestro servidor. Sleepshell está diseñado para tal caso. Creamos una cuenta en el servidor como shell e instalamos sleepshell para ella. El propietario de la cuenta podrá conectarse y reenviar puertos, pero no podrá ejecutar comandos.

Eso es todo. Espero que haya sido interesante. Estaré encantado de recibir cualquier comentario y consejo sobre el texto del artículo.

Enlaces relacionados
www.faqs.org/faqs/unix-faq/shell/shell-differences - tabla resumen de diferencias y similitudes de shell
www.mariovaldez.net/software/sleepshell - Sleep Dummy Shell
ipython.org/ipython-doc/dev/interactive/shell.html - IPython como shell del sistema
www.opennet.ru/base/dev/ipython_sysadmin.txt.html - Shell IPython como herramienta de administrador del sistema

El shell del lenguaje de comandos (traducido como shell, shell) es en realidad un lenguaje de programación de muy alto nivel. En este idioma, el usuario controla la computadora. Normalmente, después de iniciar sesión, comienza a interactuar con el shell de comandos. Una señal de que el shell está listo para recibir comandos es el indicador que muestra en la pantalla. En el caso más sencillo es un dólar (“$”). Shell no es necesario y es el único lenguaje de comandos (aunque es el que está estandarizado en el marco de POSIX, el estándar de sistemas móviles). Por ejemplo, el lenguaje cshell es bastante popular; también existen kshell, bashell y otros. Además, cada usuario puede crear su propio lenguaje de comandos. Puede trabajar simultáneamente con diferentes lenguajes de comando en una instancia del sistema operativo. shell es uno de los muchos comandos de UNIX. Es decir, el conjunto de comandos "shell" incluye el comando "sh", que llama al intérprete "shell". El primer "shell" se llama automáticamente cuando inicia sesión y muestra un programador. Después de esto, puede llamar a cualquier comando para su ejecución, incluido el propio "shell", que creará un nuevo shell dentro del anterior. Entonces, por ejemplo, si prepara el archivo "archivo_1" en el editor:

Eco Hola!

entonces este será un archivo de texto normal que contiene el comando "echo" que, cuando se ejecuta, muestra todo lo escrito a su derecha en la pantalla. Puede hacer que el archivo "file_1" sea ejecutable usando el comando "chmod 755 file_1". Pero se puede hacer llamando explícitamente al comando "sh" ("shell"):

Archivo sh_1

sh< file1

El archivo también se puede ejecutar en la instancia de shell actual. Hay un comando específico para este "." (punto), es decir

Archivo_1

Dado que UNIX es un sistema multiusuario, incluso puede trabajar en una computadora personal en paralelo en, digamos, 12 pantallas (cambiar de pantalla a pantalla ALT/tecla de función), teniendo en cada pantalla un nuevo (o el mismo) usuario con su propio shell de comandos. También puede abrir una gran cantidad de ventanas en el modo gráfico X-Window, y cada ventana puede tener su propio usuario con su propio shell de comandos... El elemento central del lenguaje del shell es el comando.

Estructuras de mando:

Los comandos en el shell suelen tener el siguiente formato:

<имя команды> <флаги> <аргумент(ы)>

Por ejemplo:

Ls -ls /usr/bin

Donde ls es el nombre del comando para generar el contenido del directorio, -ls son las banderas ("-" es un signo de banderas, l es el formato largo, s es el volumen de archivos en bloques), /usr/ bin es el directorio para el cual se ejecuta el comando. Este comando mostrará el contenido del directorio /usr/bin en formato largo y agregará información sobre el tamaño de cada archivo en bloques. Desafortunadamente, esta estructura de comando no siempre se sigue. por un signo menos, y las banderas no siempre son una palabra, variedad en la presentación de argumentos. Los comandos con formatos exóticos incluyen comandos de "ejecución" como cc, que llama al compilador de lenguaje C, tar, que trabaja con archivos, dd, que copia. archivo con conversión, buscar: buscar archivos y varios otros. Como regla general, el shell percibe la primera palabra como un comando.

la primera palabra será descifrada por el shell como un comando (concatenación), que mostrará un archivo llamado "cat" (la segunda palabra) ubicado en el directorio actual. Redirección de comandos La entrada estándar (entrada) - "stdin" en el sistema operativo UNIX se realiza desde el teclado del terminal, y la salida estándar (salida) - "stdout" se dirige a la pantalla del terminal. También hay un archivo de mensaje de diagnóstico estándar: "stderr", que se analizará un poco más adelante. Un comando que puede operar en entradas y salidas estándar se llama FILTRO. El usuario dispone de medios convenientes para redirigir la entrada y salida a otros archivos (dispositivos). Los símbolos ">" y ">>" indican la redirección de salida.

ls >file_1 El comando "ls" generará una lista de archivos en el directorio actual y la colocará en el archivo "file_1" (en lugar de imprimirla en la pantalla). Si el archivo "file_1" existía antes, será sobrescrito por el nuevo.

Contraseña >>archivo_1<" и "<<" обозначают перенаправление ввода.

el comando pwd formará el nombre completo del directorio actual y lo colocará al final del archivo "archivo_1", es decir ">>" se agrega al archivo si no está vacío. Símbolos "

baño-l

contará y mostrará el número de líneas en el archivo file_1.<

Ed archivo_2<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

el comando pwd formará el nombre completo del directorio actual y lo colocará al final del archivo "archivo_1", es decir ">>" se agrega al archivo si no está vacío. Símbolos " creará el archivo "file_2" usando el editor, directamente desde la terminal. El final de la entrada está determinado por el carácter de la derecha "

archivo_4

Wc -l >archivo_4

se realizan de la misma manera: se cuenta el número de líneas en el archivo "archivo_3" y el resultado se coloca en el archivo "archivo_4". El medio que combina la salida estándar de un comando con la entrada estándar de otro se llama PIPELINE y se indica mediante una barra vertical "|".

Se enviará una lista de archivos en el directorio actual a la entrada del comando "wc", que mostrará el número de líneas en el directorio. El pipeline también puede combinar más de dos comandos, cuando todos ellos, posiblemente excepto el primero y el último, son filtros:

Archivo de gato_1 | resultado grep -h | ordenar | gato -b > archivo_2

Esta canalización del archivo "file_1" ("cat") seleccionará todas las líneas que contengan la palabra "resultado" ("grep"), ordenará ("ordenar") las líneas resultantes y luego numerará ("cat -b") y imprima el resultado en el archivo "archivo_2". Como los dispositivos UNIX están representados por archivos especiales, se pueden utilizar en redirecciones. Los archivos especiales se encuentran en el directorio "/dev". Por ejemplo, "lp" - imprimir; "consola" - consola; "ttyi" - i-ésimo terminal; "nulo" es un archivo (dispositivo) ficticio (vacío). Entonces, por ejemplo,

Ls > /dev/lp

imprimirá el contenido del directorio actual y file_1< /dev/null обнулит файл "file_1".

Ordenar archivo_1 | camiseta /dev/lp | cola -20

En este caso, el archivo "file_1" se ordenará e imprimirá, y las últimas 20 líneas también se imprimirán en la pantalla. Volvamos a la redirección de salida. Los archivos estándar están numerados:

0 - entrada estándar, 1 - salida estándar 2 - stderr. Si no desea tener un mensaje de error en la pantalla, puede redirigirlo desde la pantalla al archivo que especifique (o desecharlo por completo redirigiéndolo al archivo de "dispositivo vacío" - /dev/null). Por ejemplo, al ejecutar el comando

Gato archivo_1 archivo_2

que debería mostrar el contenido de los archivos “archivo_1” y “archivo_2” secuencialmente en la pantalla, le dará, por ejemplo, lo siguiente

111111 222222 cat: f2: no existe tal archivo o directorio

donde 111111 222222 es el contenido del archivo "archivo_1" y falta el archivo "archivo_2", que el comando "cat" informó al archivo de diagnóstico estándar, de forma predeterminada, al igual que la salida estándar representada por la pantalla. Si no desea que aparezca ese mensaje en la pantalla, puede redirigirlo al archivo que especifique:

Gato archivo_1 archivo_2 2>f-err

Se enviarán mensajes de error (como lo indica la redirección "2>") al archivo "f-err". Por cierto, puedes enviar toda la información a un archivo “ff”, usando en este caso la construcción

Gato archivo_1 archivo_2 >>ff 2>ff

Puede especificar no sólo qué archivo estándar redirigir, sino también a qué archivo estándar redirigir.

Gato archivo_1 archivo_2 2>>ff 1>&2

Aquí, primero se redirige "stderr" (en modo de adición) al archivo "ff", y luego la salida estándar se redirige a "stderr", que en este punto es el archivo "ff". Es decir, el resultado será similar al anterior. La construcción "1>&2" significa que además del número del archivo estándar al que redirigir, debes poner "&" delante; toda la estructura está escrita sin espacios.<- закрывает стандартный ввод. >- cierra la salida estándar. Archivos de comando. Hay varias opciones para permitir que un archivo de texto se utilice como comando. Usemos un editor para crear un archivo llamado "cmd" que contenga una línea como esta:

Fecha; pwd; es

Puede llamar al shell como un comando, denominado "sh", y pasarle un archivo "cmd" como argumento o como entrada redirigida, es decir.

$shcmd

$sh

El resultado de ejecutar cualquiera de estos comandos será la fecha, luego el nombre del directorio actual y luego el contenido del directorio. Una opción más interesante y conveniente para trabajar con un archivo por lotes es convertirlo en ejecutable, es decir. simplemente conviértalo en un comando, lo cual se logra cambiando el código de seguridad. Para hacer esto, debe permitir la ejecución de este archivo. Por ejemplo,

Mod 711 cmd

creará el código de seguridad "rwx__x__x". Entonces una simple llamada

ejecutará los mismos tres comandos. El resultado será el mismo si el archivo con el contenido

Fecha; pwd; es

se representa en la forma: fecha pwd ls ya que la transición a otra línea también es un separador en la secuencia de comandos. Por lo tanto, los archivos ejecutables pueden ser no solo archivos obtenidos como resultado de la compilación y el ensamblaje, sino también archivos escritos en el lenguaje Shell. Se ejecutan en modo interpretación utilizando un intérprete de shell.

Depuración de archivos por lotes

SHELL utiliza dos mecanismos para depurar archivos por lotes. El primero es: set -v imprime las líneas del archivo de comando a medida que se leen. Este modo se utiliza cuando se buscan errores de sintaxis. Para usarlo, no necesita modificar el archivo de comando, por ejemplo: sh -v proc... aquí proc es el nombre del archivo de comando. El modificador -v se puede utilizar junto con el modificador -n, que evita la ejecución de comandos posteriores (el comando set -n bloquea el terminal hasta que se ingresa el indicador EOF). El comando set -x muestra los comandos a medida que se ejecutan, y las líneas del programa se envían al terminal y sus valores se sustituyen en lugar de las variables. Para cancelar los modificadores -x y -v, puede usar el comando set - y para instalar, asigne el valor correspondiente a una variable macro. ENTORNO SHELL (VARIABLES Y PARÁMETROS) En el lenguaje Shell, puede escribir archivos por lotes y usar el comando "chmod" para hacerlos ejecutables. Después de esto, no se diferencian de otros comandos del sistema operativo UNIX.

variables de shell

El nombre de una variable de shell es una secuencia de letras, números y guiones bajos que comienzan con una letra. El valor de una variable de shell es una cadena de caracteres. El hecho de que sólo haya dos tipos de datos en el shell: una cadena de caracteres y un archivo de texto, por un lado, facilita la participación en la programación de usuarios finales que nunca antes han hecho programación y, por otro lado, provoca una cierta protesta interna entre muchos programadores que están acostumbrados a una diversidad significativamente mayor y una mayor flexibilidad de medios lingüísticos. Sin embargo, es interesante observar cómo los programadores altamente calificados, familiarizados con las "reglas del juego" del shell, escriben programas en él muchas veces más rápido que en C, pero, lo que es especialmente interesante, en algunos casos estos programas funcionan incluso más rápido que los implementados en C. Un nombre de variable es similar a la idea tradicional de un identificador, es decir el nombre puede ser una secuencia de letras, números y guiones bajos, comenzando con una letra o un guión bajo. El operador de asignación "=" se puede utilizar para asignar valores a variables.

Var_1=13 - "13" no es un número, sino una cadena de dos dígitos.

var_2="SO UNIX" - Aquí se requieren comillas dobles (" ") porque hay un espacio en la cadena.

También son posibles otras formas de asignar valores a las variables del shell. Por ejemplo, la grabación

hace que el comando "fecha" se ejecute primero (las comillas invertidas indican que el comando adjunto debe ejecutarse primero), y el resultado de su ejecución, en lugar de enviarse a la salida estándar, se asigna como el valor de una variable, en este caso "DAT". También puede asignar un valor a una variable usando el comando "leer", que garantiza que el valor de la variable se reciba desde la pantalla (teclado) en modo de diálogo. Por lo general, el comando "leer" en el archivo por lotes va precedido del comando "eco", que le permite mostrar previamente algún mensaje en la pantalla. Por ejemplo:

Echo -n "Ingrese un número de tres dígitos:" lea x

Al ejecutar esta parte del archivo de comando, después de que se muestre el mensaje

Ingrese un número de tres dígitos:

el intérprete se detendrá y esperará a que se ingrese un valor desde el teclado. Si ingresó, digamos, "753", este se convertirá en el valor de la variable "x". Un comando de "lectura" puede leer (asignar) valores a varias variables a la vez. Si hay más variables en "leer" de las ingresadas (separadas por espacios), a las restantes se les asigna una cadena vacía. Si hay más valores transmitidos que variables en el comando "leer", los adicionales se ignoran. Al acceder a una variable de shell, debe preceder el nombre con el símbolo "$". Entonces los comandos echo $var_2 echo var_2 se mostrarán en la pantalla

Sistema operativo UNIX var_2 Escapando

Echemos un vistazo más de cerca a las técnicas de escape utilizadas en el caparazón. Las comillas dobles (" "), las comillas simples (" ") y las barras invertidas (\) se utilizan como dispositivos de escape. Su acción se desprende claramente de los ejemplos: puedes escribir varias tareas en una línea.

X=22 y=33 z=$x A="$x" B="$x" C=\$x D="$x + $y + $z" E="$x + $y + $z " F=$x\ +\ $y\ +\ $z

(la asignación G=$x+$y fallaría debido a los espacios) Entonces

Eco A = $A B = $B C = $C eco D = $D E = $E F = $F eco de evaluación evaluado A = $A eco de evaluación evaluado B = $B eco de evaluación evaluado C = $C

Se mostrará en la pantalla.

A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 evaluado A = 22 evaluado B = 22 evaluado C = 22

Demos algunos ejemplos más relacionados con los cambios de línea de escape. Deje que a la variable "cadena" se le asigne el valor de una "matriz" de 2x3: abc def Tenga en cuenta que para evitar asignar espacios adicionales, la segunda línea de la matriz comienza desde la primera posición de la siguiente línea: cadena="abc def" Luego hay tres opciones para escribir la variable en el comando echo "echo" $string echo "$string" echo "$string" dará respectivamente tres resultados diferentes: abc def $string abc def y la secuencia de comandos echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 generará archivos secuencialmente idénticos file_1 y file_2: str_1 str_2 str_1 str_2 Tenga en cuenta también que la barra invertida (\) no solo escapa el carácter que le sigue, lo que permite utilizar caracteres especiales de forma sencilla como caracteres que se representan a sí mismos (también puede escapar de sí mismo - \\), pero en un archivo de comando, una barra invertida le permite concatenar líneas en una (escapar del final de la línea. Por ejemplo, el ejemplo de línea de comando dado anteriormente:

Archivo de gato_1 | resultado grep -h | ordenar | gato -b > archivo_2

podría escribirse en un archivo por lotes, digamos como

Archivo de gato_1 | grep -h\resultado | ordenar | gato -b > archivo_2

Por cierto, el símbolo del transportador también proporciona el efecto de continuar la línea de comando. En este caso podría dar un resultado mejor, como este:

Archivo de gato_1 |

resultado grep -h |

ordenar |

gato -b > archivo_2

Manipulaciones con variables de shell A pesar de que las variables de shell generalmente se perciben como cadenas, es decir, "35" no es un número, sino una cadena de dos caracteres "3" y "5", en algunos casos se pueden interpretar de manera diferente. por ejemplo como números enteros. El comando "expr" tiene una variedad de capacidades. Ilustremos algunos con ejemplos: Ejecutar un archivo por lotes:

X=7 y=2 a=`expr $x + $y` ; eco a=$a a=`expr $a + 1`; echo a=$a b=`expr $y - $x` ; echo b=$b c=`expr $x "*" $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; eco e=$e

se mostrará en la pantalla

Se mostrarán números en la pantalla que muestran el número de caracteres coincidentes en las cadenas (desde el principio). La segunda línea no puede ser más larga que la primera:

4 0 0 0

Exportación de variables El sistema operativo UNIX tiene el concepto de proceso. Un proceso ocurre cuando se ejecuta un comando. Por ejemplo, al escribir "p" en el teclado Se genera el "proceso "p". A su vez, "p" puede generar otros procesos. Supongamos que "p" llama a "p1" y "p2", que generan secuencialmente los procesos correspondientes. Cada proceso tiene su propio entorno: un conjunto de variables disponibles. Por ejemplo, antes de ejecutar "p", ya había un entorno en el que ya estaban definidas algunas variables. Al iniciar "p" se genera un nuevo entorno "p1" y "p2" ya se generará en él; Las variables son locales del proceso en el que se declaran, es decir, donde se les asignan valores. Para que estén disponibles para otros procesos generados, se deben pasar explícitamente el comando incorporado "exportar". se utiliza.

Opciones

Los parámetros se pueden pasar al archivo de comando. El shell utiliza parámetros posicionales (es decir, el orden en que aparecen es importante). En el archivo de comando, las variables correspondientes a los parámetros (similares a las variables del shell) comienzan con el símbolo "$", seguido de uno de los números del 0 al 9: Llame a "examp-1" con los parámetros "cock" y "cola". Estos parámetros van al nuevo entorno con los nombres estándar "1" y "2". La variable (estándar) denominada "0" almacenará el nombre del cálculo llamado. Al acceder a los parámetros, el número está precedido por el símbolo del dólar "$" (como al acceder a las variables): $0 corresponde al nombre de este archivo de comando; $1 es el primer parámetro en orden; $2 segundo parámetro, etc. Dado que el número de variables a las que se pueden pasar parámetros está limitado a un dígito, es decir 9º (“0”, como ya se señaló, tiene un significado especial), luego, para transferir una mayor cantidad de parámetros, se utiliza un comando especial “shift”. El comando "set" proporciona un enfoque único a los parámetros. Por ejemplo, fragmento

Establecer a b con eco primero=$1 segundo=$2 tercero=$3

gato -b > archivo_2

Primero=a segundo=b tercero=c

aquellos. el comando "set" establece los valores de los parámetros. Esto puede resultar muy conveniente. Por ejemplo, el comando "fecha" muestra la fecha actual, diga "lunes 01 de mayo 12:15:10 2000", que consta de cinco palabras, luego

Establecer `fecha` eco $1 $3 $5

gato -b > archivo_2

lun 01 2000

El comando "set" también le permite controlar la ejecución del programa, por ejemplo: las líneas set -v se envían al terminal y el shell las lee. set +v cancela el modo anterior. set -x imprime comandos en la terminal antes de la ejecución. set +x cancela el modo anterior. El comando "set" sin parámetros muestra el estado del entorno del software en el terminal.

Sustituciones de conchas

Antes de interpretar y ejecutar directamente comandos contenidos en archivos de comandos, el shell realiza varios tipos de sustituciones: 1. SUSTITUCIÓN DE RESULTADOS. Todos los comandos entre comillas se ejecutan y el resultado se sustituye en su lugar. 2. SUSTITUCIÓN DE VALORES DE PARÁMETROS Y VARIABLES. Es decir, las palabras que comienzan con "$" se reemplazan con los valores correspondientes de variables y parámetros. 3. INTERPRETACIÓN DE BRECHAS. Los espacios escapados se ignoran. 4. GENERACIÓN DE NOMBRES DE ARCHIVOS. Se comprueba la presencia de caracteres especiales en las palabras ("*", "?"") y se realizan las generaciones correspondientes. Entorno de software Cada proceso tiene un entorno en el que se ejecuta. Shell utiliza varias de estas variables de entorno. Si escribe el comando "establecer" sin parámetros, la pantalla mostrará información sobre una serie de variables estándar creadas al iniciar sesión (y luego transmitidas a todos sus nuevos procesos "heredados"), así como las variables creadas y exportadas por sus procesos. . El tipo específico y el contenido de la información resultante depende en gran medida de qué versión de UNIX se utiliza y cómo está instalado el sistema.

El resultado de ejecutar el comando set sin parámetros (no completo):

HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/ sae/ESTUDIO/SHELL PS1=$(PWD):" " PS2=> SHELL=/bin/bash

Comentemos los valores de las variables. HOME=/root es el nombre del directorio de inicio donde termina el usuario después de iniciar sesión. Es decir, habiendo ingresado correctamente el nombre y la contraseña, me encontraré en el directorio “/root”. PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11: esta variable especifica la secuencia de archivos que el shell busca en busca de un comando. Los nombres de los archivos están separados aquí por dos puntos. El orden de visualización corresponde al orden de los nombres en el recorrido. Pero inicialmente la búsqueda se realiza entre los llamados comandos integrados. Los comandos integrados incluyen los comandos más utilizados, como "echo", "cd", "pwd", "date". Después de esto, el sistema busca en el directorio “/bin”, que puede contener los comandos “sh”, “cp”, “mv”, “ls”, etc. Luego el directorio "/usr/bin" con los comandos "cat", "ss", "expr", "nroff", "man" y muchos otros. A continuación, la búsqueda se realiza en el directorio actual ("".", u otra designación "vacío", es decir, ""), donde probablemente se encuentren los comandos que escribió. Después de escribir la línea de comando y presionar "shell" (después de realizar las sustituciones necesarias) reconoce el nombre correspondiente al comando y lo busca en los directorios enumerados en PATH. Si el comando se coloca fuera de estos directorios, no se encontrará. Si hay varios comandos con el mismo nombre, se llamará al que se encuentre en el directorio visto primero. PATH, al igual que otras variables, se puede cambiar fácilmente agregando, reorganizando o eliminando directorios. IFS= (Separador de campos interno) enumera caracteres que sirven para separar palabras (campos). Estos son "espacio", "tabulación" y "avance de línea", por lo que aquí no se ve nada a la izquierda de la tarea y dos líneas están ocupadas. LOGNAME=root - nombre de inicio de sesión (“nombre de usuario”). MAIL=/var/spool/mail/root: el nombre del archivo en el que se recibe el correo (correo electrónico). PWD=/root - nombre del directorio actual PS1=$(PWD): " " - tipo de directorio. En este caso, el indicador mostrará el nombre del directorio actual seguido de dos puntos y un espacio. Es decir, habrá "/root:". PS2=>: este mensaje (aquí ">") se utiliza como una invitación para continuar ingresando (en la siguiente línea) un comando sin terminar. Por ejemplo, escriba el corchete de apertura "(" y después de presionar en la siguiente línea verá este indicador. Si no sabe qué hacer a continuación, escriba el corchete de cierre ")" y desaparecerá. SHELL=/bin/sh: esta variable especifica el shell que está utilizando el usuario. En este caso, se utiliza el shell estándar ("sh"). El entorno inicial se instala automáticamente al iniciar sesión utilizando archivos como "/etc/rc" y "/etc/.profile". Una forma de cambiar simplemente el entorno (por ejemplo, ruta de búsqueda de comandos, tipo de programa, tipo de shell, color de pantalla, etc.) es colocar esta información en su directorio de inicio en un archivo ".profile" especializado ($(HOME)/ .profile), asignando los valores requeridos a las variables de entorno. Es decir, llama este archivo al editor y escribe lo que quieras). Luego, cada vez que inicie sesión, este archivo se ejecutará automáticamente e instalará un nuevo entorno. Este archivo DEBE colocarse en su directorio INICIO (directorio de inicio de sesión). Debe tenerse en cuenta que los nombres de archivos que comienzan con un punto generalmente tienen un estado especial. Por lo tanto, no se muestran en la pantalla con un simple comando "ls"; debe llamar a este comando con el indicador "-a". Por cierto, no son destruidos indiscriminadamente por el comando “rm *”. El propio intérprete de shell asigna automáticamente valores a las siguientes variables (parámetros): ? el valor devuelto por el último comando; $ número de proceso; ! número de proceso en segundo plano;

  1. el número de parámetros posicionales pasados ​​al shell;
  • lista de parámetros como una línea;

@ lista de parámetros, como un conjunto de palabras; - banderas pasadas al caparazón. Al acceder a estas variables (es decir, al usarlas en un archivo de comando, programa shell), debe poner "$" delante. Un papel importante en la creación de archivos únicos lo desempeña la variable especial "$$", cuyo valor corresponde al número del proceso que realiza este cálculo. Cada nuevo cálculo realizado por una computadora inicia uno o más procesos que reciben números automáticamente en orden. Por lo tanto, al utilizar el número de proceso como nombre de archivo, puede estar seguro de que cada archivo nuevo tendrá un nombre nuevo (no se escribirá en lugar de uno existente). La ventaja es también la principal desventaja de este método de nombrar archivos. No se sabe qué nombres se asignarán a los archivos. Y, si en el marco de este proceso puede encontrar un archivo "sin mirar", es decir, accediendo a él usando $$, entonces dichos archivos se pueden perder fácilmente. Esto crea problemas adicionales al depurar programas. Llamar al intérprete Después de registrar al usuario en el sistema (usando el comando de inicio de sesión), se llama al intérprete del lenguaje SHELL. Si el directorio de registro del usuario contiene un archivo .profile, antes de recibir al menos un comando desde la terminal, el intérprete ejecuta este archivo (se supone que el archivo .profile contiene comandos). Al llamar, se pueden especificar las siguientes claves: -c cadena Los comandos se leen de la cadena dada. -s Los comandos se leen desde la entrada estándar. Los mensajes del intérprete se escriben en un archivo de diagnóstico estándar. -i Modo de funcionamiento interactivo. Si el primer carácter del parámetro "0" es un signo, entonces los comandos se leen desde el archivo .profile.

ESTRUCTURAS DEL PROGRAMA===

Como en cualquier lenguaje de programación, el texto del shell puede contener comentarios. Para ello se utiliza el símbolo "#". Todo lo que está en la línea (en el archivo de comando) a la izquierda de este carácter es percibido por el intérprete como un comentario. Por ejemplo,

# Este es un comentario.

Como cualquier lenguaje de programación procedimental, el lenguaje shell tiene operadores. Varios operadores le permiten controlar la secuencia de ejecución del comando. En tales operadores, a menudo es necesario verificar la condición, que determina la dirección en la que continúan los cálculos.

Comando prueba ("")

El comando de prueba verifica que se cumpla una determinada condición. Las declaraciones de bucle y selección del lenguaje Shell se generan utilizando este comando (integrado). Dos posibles formatos de comando:

Condición de prueba

[ condición ]

Usaremos la segunda opción, es decir En lugar de escribir la palabra "prueba" antes de la condición, incluiremos la condición entre paréntesis, lo cual es más común para los programadores. De hecho, el shell reconocerá este comando por el corchete de apertura "[" como la palabra correspondiente al comando "prueba". Debe haber espacios entre los corchetes y la condición que contienen. También debe haber espacios entre los valores y el símbolo de comparación u operación. El shell utiliza condiciones de varios "tipos". CONDICIONES DE VERIFICACIÓN DE ARCHIVOS: -f archivo archivo "archivo" es un archivo normal; -d archivo archivo "archivo" - directorio; -с archivo archivo "archivo" es un archivo especial; -r archivo tiene permiso para leer el archivo "archivo"; -w el archivo tiene permiso para escribir en el archivo "archivo"; -s archivo el archivo "archivo" no está vacío.

CONDICIONES PARA PROBAR CADENAS: str1 = str2 las cadenas "str1" y "str2" coinciden; str1 != str2 las cadenas "str1" y "str2" no son iguales; -n cadena str1 "str1" existe (no vacía); -z str1 la cadena "str1" no existe (vacía). Ejemplos.

X="quién es quién"; exportar x; [ "quién es quién" = "$x" ]; eco $?

0x=abc; exportar x ; [abc = "$x"]; eco $?

0x=abc; exportar x ; [-n "$x"]; eco $?

0x=""; exportar x ; [-n "$x"]; eco $?

1

Además, hay dos valores de condición estándar que se pueden usar en lugar de condición (no se necesitan paréntesis para esto). CONDICIONES PARA COMPARAR ENTEROS: x -eq y "x" es igual a "y", x -ne y "x" no es igual a "y", x -gt y "x" es mayor que "y", x - ge y "x" es mayor o igual a "y", x -lt y "x" menor que "y", x -le y "x" menor o igual a "y". CONDICIONES COMPLEJAS: Implementado usando operaciones lógicas estándar: ! (no) invierte el valor del código de salida. -o (o) coincide con el "O" lógico. -a (y) coincide con el "Y" lógico.

Declaración condicional "si"

En general, la declaración "si" tiene la estructura

Si la condición entonces lista

Aquí "elif" se puede utilizar una versión abreviada de "else if" junto con la versión completa, es decir. Se permite el anidamiento de un número arbitrario de declaraciones "si" (así como otras declaraciones). Por supuesto, la “lista” en cada caso debe ser significativa y aceptable en el contexto dado. La estructura más truncada de este operador.

Si la condición entonces lista fi

si se cumple la condición (generalmente aquí es donde se recibe el código de finalización "0"), entonces se ejecuta la "lista", de lo contrario se omite. Ejemplos: escriba "if-1".

Si [ $1 -gt $2 ]

luego pwd else echo $0: ¡Hola!

plantilla) lista de comandos;;

plantilla) lista de comandos;;

... plantilla) lista de comandos;;

Aquí "case", "in" y "esac" son palabras funcionales. La "cadena" (puede ser un solo carácter) se compara con el "patrón". A continuación se ejecuta la "lista de comandos" de la línea seleccionada. El ";;" al final de las líneas de selección parece inusual, pero escriba ";" sería un error. Se pueden ejecutar múltiples comandos para cada alternativa. Si estos comandos están escritos en una línea, entonces el símbolo ";" se utilizará como separador de comandos. Normalmente, la última línea de selección tiene el patrón "*", que en una estructura de "caso" significa "cualquier valor". Esta línea se selecciona si el valor de la variable (aquí $z) no coincide con ninguno de los patrones escritos previamente delimitados por el corchete ")". Los valores se ven en el orden en que fueron escritos.

Operador de bucle enumerado ("for")

El operador de bucle "for" tiene la estructura:

por nombre

do lista de comandos realizados donde "for" es una palabra auxiliar que define el tipo de bucle, "do" y "done" son palabras auxiliares que resaltan el cuerpo del bucle. Deje que el comando "lsort" esté representado por un archivo por lotes

Para i en file_1 file_2 file_3 haga proc_sort $he terminado

En este ejemplo, el nombre "i" actúa como parámetro de bucle. Este nombre se puede considerar como una variable de shell a la que se asignan secuencialmente los valores enumerados (i=archivo_1, i=archivo_2, i=archivo_3) y el comando "proc_sort" se ejecuta en un bucle. A menudo se utiliza la forma "para i en *", que significa "para todos los archivos en el directorio actual". Deje que "proc_sort" a su vez esté representado por un archivo por lotes

Gato $1 | ordenar | camiseta /dev/lp > $(1)_sorted

aquellos. los archivos especificados se ordenan secuencialmente, los resultados de la clasificación se imprimen ("/dev/lp") y se envían a los archivos file_1_sorted file_2_sorted y file_3_sorted

Declaración de bucle con condición verdadera ("mientras")

lista de comandos realizados donde "mientras" es una palabra auxiliar que determina el tipo de bucle con una condición verdadera. La lista de comandos en el cuerpo del bucle (entre "do" y "done") se repite hasta que la condición sigue siendo verdadera (es decir, el código de finalización del último comando en el cuerpo del bucle es "0") o el bucle no se interrumpe. desde el interior mediante comandos especiales ("interrumpir", "continuar" o "salir"). Cuando ingresa al ciclo por primera vez, la condición debe ser verdadera. El comando "break [n]" le permite salir de un bucle. Si falta "n", equivale a "interrupción 1". "n" indica el número de bucles anidados de los que salir, por ejemplo, "romper 3" - salir de tres bucles anidados. A diferencia del comando "interrumpir", el comando "continuar [n]" solo detiene la ejecución del ciclo actual y regresa al COMIENZO del ciclo. También puede ser con un parámetro. Por ejemplo, "continuar 2" significa salir al comienzo del segundo bucle anidado (contando desde la profundidad). El comando "exit [n]" le permite salir del procedimiento por completo con un código de retorno de "0" o "n" (si se especifica el parámetro "n"). Este comando se puede utilizar en más que solo bucles. Incluso en una secuencia lineal de comandos, puede resultar útil durante la depuración detener el cálculo (actual) en un punto determinado.

Declaración de bucle con condición falsa ("hasta")

El operador de bucle "hasta" tiene la estructura:

hasta la condición

lista de comandos realizados donde "hasta" es una palabra auxiliar que determina el tipo de bucle con una condición falsa. La lista de comandos en el cuerpo del bucle (entre "hacer" y "hecho") se repite hasta que la condición sigue siendo falsa o el bucle es interrumpido desde el interior por comandos especiales ("romper", "continuar" o "salir"). ). La primera vez que ingresa al bucle, la condición no debería ser verdadera. La diferencia con el operador " while " es que se verifica que la condición del bucle no sea falsa (para un código de salida distinto de cero del último comando del cuerpo del bucle) y se verifica DESPUÉS de cada (¡incluida la primera!) ejecución de comandos en el cuerpo del bucle. Ejemplo.

Hasta que sea falso

lea x si [$x = 5] entonces haga eco lo suficiente; romper si no hacer eco un poco más fi

Aquí el programa espera en un bucle infinito a que se ingresen palabras (repitiendo la frase "algo más" en la pantalla) hasta que se ingresa "5". Después de esto, se emite "suficiente" y el comando "interrumpir" deja de ejecutar el bucle.

Operador vacío

La declaración vacía tiene el formato

:

No hace nada. Devuelve el valor "0".

Funciones en shell

La función le permite preparar una lista de comandos de shell para su posterior ejecución. La descripción de la función es la siguiente:

Nombre() (lista de comandos)

después de lo cual la función se llama por su nombre. Cuando se ejecuta la función, no se crea ningún proceso nuevo. Se ejecuta en el entorno del proceso correspondiente. Los argumentos de la función se convierten en sus parámetros posicionales; el nombre de la función es su parámetro cero. Puede interrumpir la ejecución de una función utilizando el operador "return [n]", donde (opcional) "n" es el código de retorno.

Manejo de interrupciones ("trampa")

Puede ser necesario proteger la ejecución del programa contra interrupciones. La mayoría de las veces encontrará las siguientes interrupciones correspondientes a las señales: 0 salida del intérprete, 1 colgar (desconexión del abonado remoto), 2 interrupción del , 9 destrucción (no interceptado), 15 fin de ejecución. Para protegerse contra interrupciones, existe un comando "trampa", que tiene el formato:

Trampa de señales de "lista de comandos"

Si ocurren interrupciones en el sistema, cuyas señales se enumeran separadas por un espacio en las "señales", entonces se ejecutará la "lista de comandos", después de lo cual (si el comando "salir" no se ejecutó en la lista de comandos) el control Regrese al punto de interrupción y la ejecución del archivo de comando continuará. Por ejemplo, si necesita eliminar archivos en "/tmp" antes de interrumpir la ejecución de un archivo de comando, puede hacerlo con el comando "trap":

Trampa "rm /tmp/*; salida 1" 1 2 15

que precede a otros comandos en el archivo. Aquí, después de eliminar los archivos, se cerrará el archivo de comando.




Arriba