Salida del comando de Linux al archivo. Redirigir entradas y salidas. Redirigir entrada estándar

Cualquier programa es una "máquina automática" diseñada para procesar datos: al recibir una información como entrada, produce otra como resultado de su trabajo. Aunque la información entrante y/o saliente puede ser nula, es decir, simplemente ausente. Los datos que se transfieren al programa para su procesamiento son su entrada, lo que produce como resultado de su trabajo es su salida. Organizar la entrada y salida de cada programa es tarea del sistema operativo.

Cada programa trabaja con datos. cierto tipo: texto, gráficos, sonido, etc. Como probablemente ya haya quedado claro, la interfaz principal de administración del sistema en Linux es una terminal, que está diseñada para transferir información de texto del usuario al sistema y viceversa. Dado que la entrada desde el terminal y la salida al terminal sólo pueden ser información de texto, entonces la entrada y salida de los programas asociados al terminal también deben ser de texto. Sin embargo, la necesidad de trabajar con datos de texto no limita las capacidades de gestión del sistema, sino que, por el contrario, las amplía. Una persona puede leer el resultado de cualquier programa y comprender lo que está sucediendo en el sistema, y diferentes programas resultan compatibles entre sí porque utilizan el mismo tipo de representación de datos: texto.

Los comandos y scripts pueden recibir entradas de dos maneras: desde una entrada estándar (vinculada al teclado) o desde un archivo. Existe una separación similar para la salida: la salida de un comando o script se envía a la pantalla del terminal de forma predeterminada, pero puede redirigirla a un archivo. Si ocurren errores durante la operación. Los mensajes sobre ellos también se muestran en la pantalla y el flujo de errores también se puede redirigir a un archivo.

Primero veamos un par de comandos que se pueden usar para organizar E/S.

Comandos de salida al dispositivo de salida estándar

Linux proporciona varios comandos para imprimir mensajes en una salida estándar:

  • echo: imprime una cadena en la salida estándar.
  • printf: imprime texto formateado en salida estándar.
  • sí: imprime texto repetido en la salida estándar.
  • seq: imprime una secuencia de números en la salida estándar
  • clear Limpia la pantalla o ventana.

Por ejemplo, cuando se utiliza el comando echo, si especifica el carácter de control \c, cuando se complete la salida, no irá a nueva linea:

$ echo "¿Cuál es tu nombre?\c"

¿Cuál es tu nombre?$

Aquí $ es el símbolo de invitación.

La línea también puede calcular los valores de las variables del shell e incluso otros comandos. Por ejemplo, el siguiente comando informa cuál es el directorio de inicio del usuario actual ( variable de entorno$HOME) y a qué terminal está conectado (el comando tty está entre comillas para que el intérprete ponga el resultado de su ejecución en la línea).

$ echo "Su directorio de inicio es $HOME, está conectado a la terminal - `tty` "

Su directorio de inicio es /home/knoppix, está conectado al terminal - /dev/tty1

Porque comillas dobles Dado que tienen un propósito especial en el intérprete de shell, para incluir comillas dobles en la cadena de salida, debe deshacer su propósito especial usando una barra invertida (\). Esto cancela la asignación de cualquier carácter especial.

Por ejemplo, para mostrar la cadena "/dev/tty1" necesita ejecutar:

$echo “\”/dev/tty1\””

Comandos de entrada desde dispositivo estándar aporte

El comando de lectura lee una línea de la entrada estándar y escribe su contenido en las variables especificadas. Al especificar varias variables, la primera palabra se escribe en la primera, la segunda palabra en la segunda, etc. el último contiene el resto de la línea.

El siguiente script llama a un comando de lectura independiente para leer cada variable.


$ prueba de gato
#!/bin/bash
eco “Nombre: \c”
leer nombre
echo “Apellido: \c”
leer apellido
echo “Nombre=” $nombre “Apellido=” $apellido

Luego, para ejecutar este script, debe darle al archivo de prueba el derecho de ejecución: chmod 0755 test y ejecutarlo./test.

Resultado de la ejecución: Nombre: Ivan Apellido: Petrov Nombre=Ivan Apellido=Petrov

ENTRADA ESTÁNDAR, SALIDA Y CORRIENTE DE ERRORES Cada uno lanzado desde intérprete de comandos

el programa recibe tres flujos de E/S abiertos:

Entrada estándar (sldin) - salida estándar (sldout) - salida de error estándar (stderr)

De forma predeterminada, estos subprocesos están asociados con el terminal. Aquellos. Cualquier programa que no utilice flujos distintos a los estándar esperará la entrada del teclado del terminal; todos los resultados de ese programa, incluidos los mensajes de error, se producirán en la pantalla del terminal. Además, cada proceso (comando, script, etc.) ejecutado en el intérprete de shell tiene un número de procesos asociados., desde el cual un proceso puede leer sus datos: y en el que puede escribirlos. Cada uno de estos archivos se identifica mediante un número llamado descriptor de archivo, pero los primeros tres archivos son los flujos de E/S predeterminados:

Descriptor de archivo
Flujo de entrada estándar 0
Salida estándar 1
Flujo de error estándar 2

En realidad, se crean 12 archivos abiertos, pero los archivos con los descriptores 0, 1 y 2 están reservados para entrada, salida y error estándar. Los usuarios también pueden trabajar con archivos que tengan descriptores de archivo del 3 al 9 (reservados).

El archivo de entrada estándar (sldin) tiene el identificador 0. De este archivo, los procesos extraen sus datos de entrada. De forma predeterminada, el flujo de entrada está asociado con el teclado (dispositivo /dev/tty), pero la mayoría de las veces proviene de una tubería desde otros procesos o desde archivo normal.

El archivo de salida estándar (stdout) tiene el identificador 1. Todos los resultados del proceso se escriben en este archivo. De forma predeterminada, los datos se envían a la pantalla del terminal (dispositivo/dev/tty), pero también se pueden redirigir a un archivo o canalizar a otro proceso.

El archivo de secuencia de errores estándar (siderr) tiene el descriptor 2. Los mensajes de error que ocurren durante la ejecución del comando se escriben en este archivo. De forma predeterminada, los mensajes de error se envían a la pantalla del terminal (dispositivo /dev/tty), pero también se pueden redirigir a un archivo. ¿Por qué asignar un archivo especial para registrar errores? El hecho es que esta es una forma muy conveniente de extraer los datos de salida reales de los resultados de un comando, así como buena oportunidad organizar eficazmente el mantenimiento de varios tipos de archivos de diario.

Una gran cantidad de empresas de servicios públicos utilizan únicamente flujos estándar. Para tales programas, el shell permite redirigir los flujos de E/S de forma independiente. Por ejemplo, puede suprimir mensajes de error, configurar la entrada o salida de un archivo.

Aquellos. Al llamar comandos, puede especificar dónde se deben recibir las entradas y dónde se deben enviar las salidas, así como los mensajes de error. De forma predeterminada, a menos que se especifique lo contrario, se supone que se trabaja con un terminal: los datos se ingresan desde el teclado y se muestran en la pantalla. Pero intérprete de shell tiene un mecanismo de redirección que permite asociar transmisiones estándar con varios archivos. En este caso, al redirigir el flujo de error estándar, se debe especificar un descriptor de archivo (2). Esto no es necesario para los flujos de entrada y salida.

Útil caso especial utilizando el mecanismo de redirección de hilos: redirección a /dev/null, que le permite deshacerse de mensajes innecesarios en la pantalla. Usando el mismo mecanismo, puedes crear archivos vacíos:

% cat myfile: se creará en el directorio actual archivo vacío miarchivo.

/dev/null es un archivo especial llamado. "dispositivo vacío" La escritura en él se realiza con éxito, independientemente de la cantidad de información "grabada". Leer desde /dev/null equivale a leer el final del archivo EOF.

Redirigir flujos de E/S se lleva a cabo, como DOS (Más precisamente, el sistema operativo DOS adoptó la sintaxis para redirigir transmisiones desde UNIX) usando los símbolos:

- redirigir el flujo de salida estándar
- redirección del flujo de salida estándar en modo agregar
- redirigir el flujo de entrada estándar
- recibir datos de la entrada estándar hasta que se encuentre un delimitador

Sin embargo, a diferencia de DOS, al crear canal de programa entre dos procesos El sistema operativo UNIX/Linux inicia ambos procesos simultáneamente y transfiere información a través del búfer del sistema (sin grabación intermedia en el disco duro). Por lo tanto, los canales de programa en UNIX/Linux OS son muy de manera eficiente intercambio. Si el buffer del sistema se desborda (por ejemplo, si el programa "enviador" envía información al canal más rápido de lo que el programa "receptor" puede procesarla), el sistema operativo suspende automáticamente el proceso que escribe en el canal hasta que el buffer se desborda. es liberado.

Operadores de redireccionamiento más comunes

No. Sintaxis Descripción
1 archivo de comando Dirige la salida estándar a nuevo archivo

2 comando 1 archivo Dirige la salida estándar al archivo especificado

Comando de 3 archivos Dirige la salida estándar al archivo especificado (modo adjuntar)

4 archivo de comando 2 y 1 Dirige la salida estándar y el error al archivo especificado

5 comando 2 archivo Dirige el error estándar al archivo especificado

6 comando 2 archivo Dirige el error estándar al archivo especificado (modo agregar)

7 archivo de comando 2 y 1 Dirige la salida estándar y el error al archivo especificado (modo adjuntar)

8 comando archivo1 archivo2 Recibe la entrada del primer archivo y envía la salida al segundo archivo

9 archivo de comando como entrada estándar recibe datos de archivo especificado

10 comando delimitador Recibe datos de la entrada estándar hasta que se encuentra un delimitador

11 comando &m Recibe datos de un archivo con el descriptor m como entrada estándar

12 comando &m Dirige la salida estándar al descriptor de archivo m

El operador n&m permite redirigir un archivo con el descriptor n a la misma ubicación que un archivo con el descriptor m. Operadores similares en línea de comando puede haber varios, en cuyo caso se calculan de izquierda a derecha.

comando ejecutivo y uso de descriptores de archivos

El comando exec reemplaza el shell actual con el comando especificado. Normalmente se utiliza para cerrar el intérprete actual e iniciar otro. Pero también tiene otros usos.

Por ejemplo, un comando como

El archivo Exec convierte el archivo especificado en la entrada estándar de todos los comandos. Realizarlo en
modo interactivo no tiene sentido: está destinado a usarse en scripts,
para que todos los comandos que vienen después lean sus datos de entrada del archivo. En este caso
debe haber un comando al final del script

Exec &– que cierra el flujo de entrada estándar (en en este caso archivo). Se utiliza una técnica similar
principalmente en scripts que se ejecutan cuando cierras la sesión.

El comando exec es un puntero a un archivo con descriptor 0 (stdin). Este puntero se puede restaurar solo después de que el script haya terminado de ejecutarse.
Si el script pretende continuar leyendo datos desde el teclado, entonces debe guardar
puntero al flujo de entrada anterior. A continuación se muestra un breve guión que demuestra cómo hacer esto.

$ gato f_desc
#!/bin/bash
ejecutivo 3 y 0 0 archivo
leer linea
leer linea2
ejecutivo 0 y 3
eco $1inel
eco $linea2

El primer comando exec almacena un puntero a la entrada estándar (stdin) en el descriptor de archivo 3
(se permite cualquier número entero entre 3 y 9) y luego abre archivo de archivo para leer. Los siguientes dos comandos de lectura
leer dos líneas de texto de un archivo. El segundo comando exec restaura el puntero a la entrada estándar: ahora
está asociado con el archivo stdin, no con el archivo. Los comandos de eco finales muestran el contenido de las líneas leídas en la pantalla,
que se almacenaron en las variables linel e Iine2.

El resultado del guión:
$./f_desc
¡Hola!
¡Adiós!

Si la salida a la consola (gráfica) no es muy voluminosa, simplemente puede seleccionar una pieza con el mouse y hacer clic para pegarla en el mensaje. botón central. De lo contrario, puedes utilizar la redirección de la salida a un archivo a través de un embudo, como este:

Algunos parámetros de comando > logfile.txt

Para ver el resultado de la ejecución en la pantalla y al mismo tiempo escribir en un archivo, puede usar el comando tee:

Algunos parámetros de comando | tee -a archivo de registro.txt

El comando setterm -dump crea una instantánea del búfer de la consola virtual actual como un archivo de texto simple con el nombre predeterminado screen.dump. Como argumento, puede utilizar el número de la consola que desea realizar el volcado. Y agregar la opción -file filename redirigirá este volcado a un archivo con nombre especificado. La opción -append agregará un nuevo volcado a un archivo ya existente: el screen.dump "predeterminado" o nombrado con la opción -file.

Aquellos. después de usar el comando como

Setterm -dump -archivo /root/screenlog

respectivamente en el archivo /root/screenlog será el contenido de una página de consola.

Encontré otra solución para copiar/pegar texto en una consola de texto sin mouse. También puede copiar texto desde el búfer de desplazamiento (es decir, todo lo que está en la pantalla y encima de la pantalla). Para comprender mejor, lea sobre administrador de consola pantalla de ventanas. También puede resultar útil aumentar el tamaño del búfer de desplazamiento.

1) Pantalla de inicio

2) Presione Entrar. Todo. Estamos en la ventana cero de la consola.

3) Ejecute los comandos necesarios, cuyo resultado debe copiarse.

4) Ctrl+A, Ctrl+[ - estamos en modo copia. Coloque el cursor al comienzo de la selección, presione la barra espaciadora, luego coloque el cursor al final de la selección, presione la barra espaciadora. El texto se ha copiado al portapapeles.

5) Ctrl+A, c: hemos creado una nueva primera ventana.

6) Ctrl+A, 1 - fuimos a la primera ventana.

7) Abrir cualquier (?) editor de texto(Lo probé en mc) y presione Ctrl+A, Ctrl+] - se inserta el texto. Ahorrar.

8) Ctrl+A, Ctrl+0 - vuelve a la ventana cero.

¿Cómo aumentar el búfer de desplazamiento hacia atrás?

La primera solución sería aumentar el tamaño del búfer predeterminado en las fuentes del kernel y recompilarlo. Déjame suponer que eres tan reacio a hacer esto como yo y buscaré una solución más flexible.

Y existe una herramienta de este tipo, y se llama consola framebuffer, fbcon para abreviar. Este dispositivo tiene un archivo de documentación. fbcon.txt; Si instaló la documentación del kernel, entonces la tiene. Búscalo en algún lugar de la zona. /usr/compartir ramas (no puedo especificar la ruta exacta debido a diferencias en las distribuciones).

Llegados a este punto pido disculpas: debemos hacer una pequeña digresión y hablar un poco sobre el buffer de vídeo ( búfer de cuadros ).

Un búfer de video es un búfer entre la pantalla y el adaptador de video. Su belleza es que se puede manipular: permite trucos que no funcionarían si el adaptador estuviera conectado directamente a la pantalla.

Uno de esos trucos implica el búfer de desplazamiento; Resulta que puedes "pedirle" al búfer de vídeo que asigne más memoria búfer de desplazamiento. Esto se logra mediante los parámetros de arranque del kernel. Primero exiges búfer de cuadros(búfer de vídeo); Luego solicita un búfer de desplazamiento más grande.

El siguiente ejemplo es para GRUB, pero se puede adaptar fácilmente para LILO. en archivo Configuración de GRUB - menú.lst- busque la línea correspondiente al kernel y luego: Elimine la opción vga=xxx, si está presente. Agregue la opción video=vesabf o lo que coincida con su hardware. Agregue la opción fbcon=scrollback:128. Después de este procedimiento, la línea de parámetros del kernel debería verse así:

Kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

La pregunta es, ¿por qué eliminar la opción vga=xxx? Debido a posibles conflictos con opción de vídeo. En mi adaptador ATI, no puedo cambiar el búfer de desplazamiento si vga=xxx está en la lista. Puede que este no sea el caso en su caso. Si las opciones anteriores funcionan, bien; pero ¿qué pasa si desea aumentar el número de filas o establecer más fuente pequeña en la pantalla? Siempre hacías esto usando la opción vga=xxx, y eso es lo que desapareció. No se preocupe: se puede lograr lo mismo cambiando los parámetros de fbcon como se describe en el archivo. fbcon.txt(pero no descrito en este artículo).

Con la opción fbcon=scrollback:128, mi búfer de desplazamiento aumentó a 17 pantallas (35 veces Shift+PgUp en media pantalla). Por cierto, 128 es un kilobyte. El autor del artículo afirma que es imposible establecer más. No lo he probado.

Puedes usar script.

Nombre de archivo de script.log

cuando se completen todos los comandos necesarios -

Todo se registra en filename.log

FreeBSD tiene una maravillosa utilidad de vigilancia que te permite monitorear terminales, pero resulta que en Linux realiza funciones completamente diferentes =\ Si buscas en Google este tema, encontrarás algo...

Sistema de E/S en LINUX.

En el sistema de entrada/salida todo dispositivos externos Se tratan como archivos en los que se permite realizar operaciones normales. operaciones de archivos. Por supuesto, existen controladores de dispositivo, pero la interfaz con ellos está diseñada para que el usuario acceda a un archivo especial. Los archivos especiales son un medio para unificar el sistema de entrada/salida.

A cada dispositivo conectado (terminal, discos, impresora, etc.) le corresponde al menos un archivo especial. Mayoría estos archivos especiales almacenado en el directorio /dev:
$ cd /desarrollador
$ ls-l
panel de control del sistema de suela
porciones dsk en el disco
disquete fd0 1
memoria memoria
impresora lp
lр0 puerto paralelo 0
. . .
porción raíz en el disco para el sistema de archivos raíz
porción de intercambio de intercambio
nombre alternativo de syscon para la consola
systty es otro nombre para la consola del sistema
directorio de términos para terminales
ttyS0 puerto serie 0 (COM1)
. . .

Cuando un programa escribe en un archivo tan especial, el sistema operativo lo intercepta y lo envía a un dispositivo, como una impresora). Cuando se leen datos de este tipo de archivos, en realidad provienen de un dispositivo, como un disco. El programa no debe tener en cuenta las características operativas del dispositivo de entrada/salida. Para ello, se utilizan archivos especiales (controladores), que sirven como interfaz entre los componentes del kernel del sistema operativo y los programas de aplicación de propósito general.

El sistema detecta la diferencia entre un archivo normal y un archivo especial sólo después de haber analizado el inodo correspondiente al que hace referencia la entrada del directorio.
El archivo especial inodo contiene información sobre la clase, tipo y número del dispositivo. La clase de dispositivo define dispositivos basados ​​en caracteres y en bloques. Un ejemplo de dispositivo con intercambio carácter por carácter es un teclado. Los archivos especiales que proporcionan comunicación con dispositivos de este tipo se denominan orientados a bytes. Los dispositivos de bloques se caracterizan por el intercambio de grandes bloques de información, esto acelera el intercambio y lo hace más eficiente. Todos los dispositivos de disco admiten el intercambio de bloques y los archivos especiales que los sirven se denominan orientados a bloques. Los archivos especiales no contienen ninguna información simbólica, por lo que su longitud no se indica en el listado del directorio.

El tipo y número del dispositivo también son las características principales de los archivos especiales (los números principal y adicional del dispositivo correspondiente se colocan en el campo de longitud). El primero de ellos determina el tipo de dispositivo, el segundo lo identifica entre dispositivos similares. El sistema operativo puede servir simultáneamente a varias docenas e incluso cientos de terminales. Cada uno de ellos debe tener su propio archivo especial, por lo que tener un archivo principal y números adicionales le permite establecer la correspondencia requerida entre el dispositivo y dicho archivo.

Puede crear múltiples sistemas de archivos en un disco. Algunos sistemas usan uno sistema de archivos en disco, mientras que otros tienen varios. Se puede crear un nuevo sistema de archivos usando el comando mkfs (make sistema de archivos). Por ejemplo, la expresión # /sbin/mkfs /dev/dsk/fl1 512 significa: crear un disquete b: de tamaño 512 bloques.

Opcionalmente, puede especificar el tamaño del sistema de archivos en bloques y el número de i-nodos (es decir, el número máximo de archivos que se pueden almacenar en el sistema de archivos). De forma predeterminada, el número de i-nodos es igual al número de bloques dividido por cuatro. El número máximo de i-nodos por sistema de archivos es 65 000. Si por alguna razón necesita más de 65 000 i-nodos en un disco, debe crear dos o más sistemas de archivos en ese disco.

Cualquier sistema de archivos se puede adjuntar (montar) a un árbol de directorios compartido en cualquier punto del mismo. Por ejemplo, el directorio / es el directorio raíz del sistema, además, es la base del sistema de archivos, que siempre está montado. El directorio /usr1 está ubicado en el directorio /, pero en este caso es un sistema de archivos separado del sistema de archivos raíz, ya que todos los archivos que contiene están en una parte separada del disco o en un disco completamente separado. El sistema de archivos /usr1 es el sistema de archivos montado: la raíz en el punto donde existe el directorio /usr1 en la jerarquía general (Figuras 1 y 2).

Arroz. 1. Sistema de archivos antes
montaje /dev/dsk/os1

Arroz. 2. Sistema de archivos después
montar /dev/dsk/os1 como /usr/

Para montar un sistema de archivos, utilice el comando /sbin/mount. Este comando permite que el sistema de archivos determinado se ubique en cualquier lugar de la estructura de directorios existente:
#/sbin/mount/dev/dsk/osl/usr1 monta /dev/dsk/osl en /usr1
#/sbin/mount/dev/dsk/flt/a monta /dev/dsk/flt en /a

Si desea montar un sistema de archivos en discos que deben estar protegidos contra escritura para que el sistema sea de solo lectura, debe agregar la opción -r al comando /sbin/mount.
El directorio en el que se está montando el sistema de archivos debe estar actualmente vacío, ya que no se podrá acceder a su contenido mientras se esté montando el sistema de archivos.

Para obtener información sobre los sistemas de archivos que están montados, por ejemplo, en un sistema LINUX, puede utilizar el comando /sbin/mount sin argumentos (Figura 3).

Arroz. 3.

Este comando imprime el directorio donde se montó el sistema de archivos (por ejemplo, usrl), el dispositivo /dev en el que se encuentra y la hora y fecha en que se montó. Para desmontar un sistema de archivos, use el comando /sbin/umount, que tiene acción inversa en relación con el comando de montaje. Libera el sistema de archivos y lo saca por completo de la estructura de directorios, de modo que todo archivos propios y los directorios se vuelven inaccesibles:
# /sbin/umount /b
# /sbin/umount /dev/dsk/0s2

El sistema de archivos raíz no se puede desmontar. Además, el comando umount fallará si alguien está usando un archivo del sistema de archivos que está intentando desmontar (esto podría incluso ser tan simple como estar en uno de los directorios del sistema de archivos que se está desmontando).

En los comandos montar y desmontar, el usuario utiliza la abreviatura de dispositivos de disco físico.
En LINUX, los dispositivos de disco tienen designaciones únicas. En LINUX, el usuario nunca enfrenta el problema de especificar exactamente dispositivo físico, en el que se encuentra la información. En LINUX, una cantidad arbitraria de dispositivos externos puede ser muy grande, por lo que el usuario solo se ocupa del nombre del directorio en el que se encuentran los archivos que necesita. Todos los sistemas de archivos se montan una vez, normalmente cuando se inicia el sistema. Los sistemas de archivos de computadoras remotas también se pueden montar en algunos directorios.

Para dispositivos físicos en LINUX, existen directorios dsk y rdsk, que contienen archivos correspondientes a los dispositivos de disco. Por lo general, los nombres de los archivos en estos directorios son los mismos y la única diferencia entre ellos es que el directorio rdsk contiene dispositivos de disco con acceso especial (sin formato), que algunos dispositivos del sistema usan para más acceso rápido al disco. Un directorio dsk típico contiene siguientes dispositivos:
$1s /desarrollador/dsk
0s0 1s0 c0t0d0s0 c0tld0s0 f0 f05q f13dt fld8d
0sl 1sl c0t0d0sl c0tld0sl f03d f05qt f13h fld8dt
0s2 1s2 c0t0d0s2 c0tld0s2 f03dt f0d8d f13ht fld8t
. . .
$

En un sistema LINUX, los dispositivos de disco se dividen lógicamente en secciones, similares a las particiones definidas en Tabla de particiones MasterBoot MS DOS. Los archivos 0s1, 0s2, 0s3, etc. corresponden a las secciones uno, dos, tres, etc. del disco número 0. Los archivos 1s0, 1sl, 1s2, etc. corresponden a las secciones uno, dos, tercero, etc. del disco número 1. Si el sistema tiene más discos, las secciones se numerarán ns0, nsl, etc. para cada disco numerado n.

Sistemas con un gran número. dispositivos de disco usar el siguiente sistema numeración:
con controlador d disco s sección

donde controlador es el número del controlador del disco; disco - número de disco; sección: número de sección del disco.
Por lo tanto, 0s0 suele ser equivalente a c0t0d0s0 y 0sl a c0t0d0sl, y los nombres de las secciones de tres caracteres son simplemente una abreviatura de controlador de disco con el numero 0.

Los archivos cuyos nombres comienzan con f definen varios tipos disquetes. El directorio rmt contiene archivos en dispositivos de cinta magnética:
$1s /desarrollo/rmt
c0s0 cls0 c3s0 ntape ntapel cinta tapel

Los archivos c0s0, cls0, c2s0 y c3s0 definen cuatro dispositivos de almacenamiento en cintas de casete. Las cintas y los archivos tapel definen dispositivos de almacenamiento magnético de dos carretes. Los archivos cuyos nombres comienzan con n pertenecen a los mismos dispositivos, solo que la cinta no se rebobina después de su uso, mientras que el uso de otros archivos hace que la cinta se rebobine cuando el programa que la utiliza termina de ejecutarse.

En algunos sistemas, estos archivos tienen nombres diferentes, pero todos siempre están ubicados en /dev y el diccionario que generalmente viene con el sistema contiene descripciones detalladas de los dispositivos y sus archivos asociados.

El sistema de archivos extX utiliza almacenamiento en búfer de datos para operaciones de E/S. Al leer un bloque de información, el kernel emite una solicitud de E/S a varios bloques adyacentes. Estas operaciones aceleran enormemente la recuperación de datos al leer archivos de forma secuencial. Al escribir datos en un archivo, el sistema de archivos extX escribe nuevo bloque, coloca hasta 8 bloques adyacentes uno al lado del otro por adelantado. Este método permite colocar archivos en bloques adyacentes, lo que acelera su lectura y permite lograr un alto rendimiento del sistema.

Uno de los más interesantes y temas útiles Para administradores de sistemas y nuevos usuarios que recién están comenzando a comprender cómo trabajar con el terminal: esto es la redirección de flujos de entrada salida de linux. Esta función de terminal le permite redirigir la salida de comandos a un archivo, o el contenido de un archivo a la entrada de comandos, combinar comandos y formar canales de comandos.

En este artículo, veremos cómo se realiza la redirección de flujos de E/S en Linux, qué operadores se usan para esto y dónde se puede usar todo esto.

Todos los comandos que ejecutamos nos devuelven tres tipos de datos:

  • El resultado del comando, normalmente datos de texto solicitados por el usuario;
  • Mensajes de error: informan sobre el proceso de ejecución del comando y circunstancias inesperadas que han surgido;
  • El código de retorno es un número que le permite evaluar si el programa funcionó correctamente.

En Linux, todas las sustancias se consideran archivos, incluidos los flujos de entrada/salida de Linux: archivos. Cada distribución tiene tres archivos principales que los programas pueden usar, estos están definidos por el shell y identificados por su número de descriptor de archivo:

  • ESTDIN o 0- este archivo está asociado con el teclado y la mayoría de los comandos reciben datos para trabajar desde aquí;
  • STDOUT o 1- esta es la salida estándar; el programa envía aquí todos los resultados de su trabajo. Está conectado a la pantalla, o más precisamente al terminal en el que se ejecuta el programa;
  • STDERR o 2- todos los mensajes de error se envían a este archivo.

La redirección de E/S le permite reemplazar uno de estos archivos por el suyo propio. Por ejemplo, puede forzar a un programa a leer datos de un archivo en el sistema de archivos en lugar del teclado, también puede imprimir errores en un archivo en lugar de en la pantalla, etc. Todo esto se hace usando símbolos. "<" Y ">" .

Redirigir la salida al archivo

Es muy sencillo. Puede redirigir la salida a un archivo usando el símbolo >. Por ejemplo, guardemos el resultado del comando superior:

arriba -bn 5 > top.log

La opción -b hace que el programa se ejecute en un modo no interactivo. modo por lotes, y n - repite la operación cinco veces para obtener información sobre todos los procesos. Ahora veamos qué pasó con cat:

Símbolo ">" sobrescribe información de un archivo si ya hay algo allí. Para agregar datos al uso final ">>" . Por ejemplo, redirigir la salida a archivo de Linux también para arriba:

arriba -bn 5 >> arriba.log

De forma predeterminada, se utiliza el descriptor de archivo de salida estándar para la redirección. Pero puedes especificar esto explícitamente. Este comando dará el mismo resultado:

arriba -bn 5 1>top.log

Redirigir errores al archivo

Para redirigir la salida del error a un archivo, debe especificar explícitamente el descriptor del archivo que va a redirigir. Para errores, este es el número 2. Por ejemplo, al intentar obtener acceso al directorio de superusuario, ls arrojará un error:

Puede redirigir el error estándar a un archivo como este:

ls -l /root/ 2> ls-error.log
$ gato ls-error.log

Para agregar datos al final del archivo, use el mismo símbolo:

ls -l /root/ 2>>ls-error.log

Redirigir la salida estándar y los errores al archivo

También puede redirigir todos los resultados, errores y resultados estándar a un solo archivo. Hay dos formas de hacer esto. El primero, el más antiguo, consiste en pasar ambos identificadores:

ls -l /root/ >ls-error.log 2>&1

Primero, la salida del comando ls se enviará al archivo ls-error.log utilizando el primer carácter de redirección. Entonces todos los errores se enviarán al mismo archivo. El segundo método es más sencillo:

ls -l /root/ &> ls-error.log

También puedes usar agregar en lugar de reescribir:

ls -l /root/ &>> ls-error.log

Entrada estándar desde archivo

La mayoría de los programas, excepto los servicios, reciben datos para su trabajo a través de entradas estándar. De forma predeterminada, la entrada estándar espera la entrada desde el teclado. Pero puedes forzar al programa a leer datos de un archivo usando el operador "<" :

gato

También puede redirigir inmediatamente la salida a un archivo. Por ejemplo, reordenemos la lista:

clasificar ordenar.salida

Por lo tanto, redirigimos la entrada/salida a Linux con un solo comando.

Uso de túneles

Puede trabajar no solo con archivos, sino también redirigir la salida de un comando como entrada de otro. Esto es muy útil para realizar operaciones complejas. Por ejemplo, mostremos cinco archivos modificados recientemente:

ls-lt | cabeza -n 5

Con la utilidad xargs, puede combinar comandos para que la entrada estándar se pase como parámetros. Por ejemplo, copiemos un archivo en varias carpetas:

prueba de eco/tmp/ | xargs -n 1 cp -v archivoprueba.sh

Aquí la opción -n 1 especifica que solo se debe proporcionar un parámetro por comando, y la opción -v de cp permite imprimir información detallada sobre los movimientos. Otro comando útil en tales casos es tee. Lee datos de entrada estándar y escribe en archivos o salidas estándar. Por ejemplo:

echo "Prueba de funcionamiento en T" | archivo tee1

En combinación con otros comandos, se pueden utilizar para crear instrucciones complejas de múltiples comandos.

Conclusiones

En este artículo, cubrimos los conceptos básicos de la redirección de flujos de E/S de Linux. Ahora ya sabe cómo redirigir la salida a un archivo de Linux o la salida de un archivo. Es muy simple y conveniente. Si tienes alguna duda, ¡pregunta en los comentarios!

Aunque normalmente, como se señaló, la E/S de los programas está asociada con flujos estándar, existen funciones especiales en el shell para redirigir la E/S.

5.5.1 Operadores >,< и >>

Los símbolos " se utilizan para indicar la redirección > ", "< " Y " >> ". El uso más común es redirigir la salida del comando a un archivo. Aquí hay un ejemplo:

$ ls -l > /home/jim/dir.txt

Este comando guardará en el archivo /home/jim/dir.txt una lista de archivos y subdirectorios del directorio que estaba actual en el momento en que se ejecutó el comando. es; Además, si el archivo especificado no existía, se creará; si existiera, será sobrescrito; si desea que la salida del comando se agregue al final archivo existente, entonces en lugar del símbolo > usar >> . En este caso, la presencia de espacios antes o después de los caracteres. > o >> es irrelevante y sirve únicamente para la comodidad del usuario.

Puede enviar la salida no solo a un archivo, sino también a la entrada de otro comando o a un dispositivo (como una impresora). Entonces, para contar la cantidad de palabras en el archivo /home/jim/report.txt, puede usar el siguiente comando:

$ gato /home/jim/report.txt > wc -w

y para imprimir el archivo, use el comando:

$ gato /home/jim/report.txt > lpr

Como puede ver, el operador > sirve para redirigir el flujo de salida. En relación con el flujo de entrada, el operador realiza una función similar < . El comando de ejemplo anterior para contar el número de palabras en un archivo en particular podría reescribirse de la siguiente manera (tenga en cuenta la ausencia del comando gato):

$ baño -w< /home/jim/report.txt

Esta opción de redirección se utiliza a menudo en varios scripts para comandos que normalmente aceptan (o esperan) entrada de teclado. En un script que automatiza algunos operaciones de rutina, puede darle al comando la información necesaria desde un archivo en el que está pregrabado lo que se debe ingresar para ejecutar este comando.

Debido a que los símbolos < , > Y >> actúan sobre flujos estándar, se pueden utilizar no solo de la forma habitual, como se hace habitualmente, sino también de una forma ligeramente diferente. Entonces, siguientes comandos son equivalentes:

$ gato > archivo

$gato>archivo

$ >archivo gato

$ > archivo gato

Sin embargo, por sí solo (sin ningún comando para el cual se definan flujos estándar) el símbolo de redirección no se puede utilizar, por lo que no se puede, por ejemplo, escribir

$archivo1 > archivo2

obtener una copia de un archivo. Pero eso no lo hace menos importante. este mecanismo, porque los flujos estándar están definidos para cualquier comando. En este caso, puede redirigir no solo la entrada y salida estándar, sino también otras transmisiones. Para hacer esto, especifique el número de la transmisión redirigida antes del símbolo de redirección. La entrada estándar stdin es el número 0, la salida estándar stdout es el número 1, el flujo de error estándar stderr es el número 2. Es decir formato completo El comando de redirección se ve así (recuerde que los espacios cerca de > son opcionales):

comando N>M

Dónde norte Y METRO— números de secuencias estándar (0,1,2) o nombres de archivos. Uso de símbolos en algunos casos. < , > Y >> sin especificar el número de canal o el nombre del archivo sólo es posible porque 1 se sustituye de forma predeterminada por el número que falta, es decir, salida estándar. Si, operador > sin especificar un número se interpreta como 1 > .

Además de simplemente redirigir transmisiones estándar, también es posible no solo redirigir una transmisión a un canal u otro, sino también hacer una copia del contenido de la transmisión estándar. Hay un símbolo especial para esto. & , que se coloca delante del número del canal al que se redirige la transmisión:

comando N > &M

Este comando significa que la salida del número de canal norte se envía a la salida estándar y se duplica en el número de canal METRO. Por ejemplo, para que los mensajes de error se dupliquen en la salida estándar, debe dar el comando 2>&1, mientras 1>&2 duplica la salida estándar a stderr. Esta característica es especialmente útil cuando se redirige la salida a un archivo, ya que luego vemos los mensajes en la pantalla y los guardamos en el archivo.

5.5.2 Operador |

Una opción especial para la redirección de salida es un canal de software (a veces llamado tubería o transportador). Para hacer esto, dos o más comandos, de modo que la salida del anterior sirva como entrada para el siguiente, están conectados (o separados, si lo prefiere) por el carácter de barra vertical - "|". En este caso, el flujo de salida estándar del comando ubicado a la izquierda del símbolo | , se envía a la entrada estándar del programa ubicada a la derecha del símbolo | . Por ejemplo:

$ gato miarchivo | grep Linux | baño -l

Esta línea significa que la salida del comando es gato, es decir, el texto del archivo myfile, se enviará a la entrada del comando grep, que resaltará sólo las líneas que contengan la palabra "Linux". Salida del comando grep será, a su vez, dirigido a la entrada del comando baño -l, que contará el número de dichas líneas.

Los canales de programa se utilizan para combinar varios programas pequeños, cada uno de los cuales realiza sólo transformaciones específicas en su flujo de entrada, para crear una instrucción generalizada que da como resultado una transformación más compleja.

Cabe señalar que el shell llama simultáneamente a todos los comandos incluidos en la canalización para su ejecución, lanzando una instancia separada del shell para cada uno de los comandos, de modo que tan pronto como el primer programa comience a producir algo en su flujo de salida, el El siguiente comando comienza a procesarlo. De la misma manera, cada comando posterior realiza su propia operación, esperando datos del comando anterior y produciendo sus resultados como entrada del siguiente. Si desea que un comando se complete por completo antes de que comience el siguiente, puede usarlo en una línea como símbolo de canalización. | y punto y coma ; . Antes de cada punto y coma, el shell se detendrá y esperará a que todos los comandos anteriores incluidos en la canalización completen su ejecución.

El estado de salida (valor booleano devuelto después de que finaliza el programa) del canal es el mismo que el estado de salida devuelto. último comando transportador. Puede colocar un símbolo "!" delante del primer comando de la canalización, entonces el estado de salida de la canalización será la negación lógica del estado de salida del último comando. El shell espera a que se completen todos los comandos de canalización antes de establecer el valor de retorno.

5.5.3 Filtros

El último ejemplo anterior (con el comando grep) se puede utilizar para ilustrar otro concepto importante, a saber, el programa de filtrado. Los filtros son comandos (o programas) que toman un flujo de datos de entrada, realizan algunas transformaciones en él y envían el resultado a la salida estándar (desde donde se puede redirigir a otro lugar a discreción del usuario). Los comandos de filtro incluyen los comandos ya mencionados anteriormente. gato, más, menos, wc, cmp, diff, así como los siguientes comandos.

Tabla 5.1. Comandos de filtro

Equipo

Breve descripción

grep, fgrep, egrep

Buscando archivo de entrada o datos del estándar línea de entrada, que contiene el patrón especificado, y enviarlos a la salida estándar

Reemplaza todos los caracteres que aparecen en el flujo de entrada enumerados en la lista dada con los caracteres correspondientes de la segunda lista especificada

comunicación

Compara dos archivos línea por línea y genera 3 columnas en la salida estándar: una: líneas que aparecen solo en 1 archivo, la segunda, líneas que aparecen solo en el segundo archivo: y la tercera, líneas que aparecen en ambos archivos.

Formatos para imprimir archivo de texto o el contenido de la entrada estándar

sed

Un editor de cadenas utilizado para realizar algunas transformaciones en el flujo de datos de entrada (tomado de un archivo o de una entrada estándar)

Un filtro especial es el comando. tee, que "divide" el flujo de entrada, dirigiéndolo por un lado a la salida estándar y por el otro a un archivo (cuyo nombre debe especificar). Es fácil ver que por su acción el comando tee similar al operador de redirección 1>&archivo.

Las capacidades de los filtros se pueden ampliar significativamente mediante el uso expresiones regulares, permitiéndole organizar, por ejemplo, una búsqueda utilizando varias plantillas, a menudo muy complejas.

Se podría decir mucho sobre la redirección y los filtros. Pero este material está disponible en la mayoría de los libros sobre UNIX y Linux, por ejemplo Petersen [P1.4] y Kelly-Bootle [P1.8]. Por tanto, nos limitaremos a lo dicho y pasaremos a considerar el llamado entorno o entorno creado por el shell.

V. Kostromin (kos en rus-linux dot net) - 5.5. Redirección de E/S, canales y filtros


Arriba