bash – Pseudoarchivos para datos temporales

Pregunta:

A menudo quiero alimentar datos de cadena relativamente cortos (aunque podrían ser varias líneas) a programas de línea de comandos que solo aceptan entradas de archivos (por ejemplo, wdiff) de manera repetida. Claro que puedo crear uno o más archivos temporales, guardar la cadena allí y ejecutar el comando con el nombre del archivo como parámetro. Pero me parece que este procedimiento sería muy ineficaz si los datos se escriben realmente en el disco y también podría dañar el disco más de lo necesario si repito este procedimiento muchas veces, por ejemplo, si quiero alimentar líneas individuales de texto largo. archivos a wdiff. ¿Existe una forma recomendada de evitar esto? Por ejemplo, mediante el uso de pseudoarchivos como tuberías para almacenar los datos temporalmente sin escribirlos en el disco (o escribirlos solo si excede una longitud crítica). Tenga en cuenta que wdiff toma dos argumentos y, hasta donde tengo entendido, no será posible alimentar los datos haciendo algo como wdiff <"text" .

Respuesta:

En Bash, puede usar la sintaxis de redirección command0 command1 <( command0 ) , que redirige la command0 de command0 y la pasa a un command1 que toma un nombre de archivo como argumento de línea de comando. A esto se le llama sustitución de proceso .

Algunos programas que toman argumentos de línea de comando de nombre de archivo en realidad necesitan un archivo de acceso aleatorio real, por lo que esta técnica no funcionará para ellos. Sin embargo, funciona bien con wdiff :

user@host:/path$ wdiff <( echo hello; echo hello1 ) <( echo hello; echo hello2 )
hello
[-hello1-]
{+hello2+}

En segundo plano, esto crea un FIFO, canaliza el comando dentro de <( ) al FIFO y pasa el descriptor de archivo de FIFO como argumento. Para ver qué está pasando, intente usarlo con echo para imprimir el argumento sin hacer nada con él:

user@host:/path$ echo <( echo hello )
/dev/fd/63

La creación de una tubería con nombre es más flexible (si desea escribir una lógica de redirección complicada utilizando múltiples procesos), pero para muchos propósitos esto es suficiente y, obviamente, es más fácil de usar.

También existe la sintaxis >( ) para cuando quiera usarla como salida, por ejemplo

$ someprogram --logfile >( gzip > out.log.gz )

Consulte también la sección "sustitución de procesos" de la página de manual de bash y la hoja de trucos de redirecciones de Bash para conocer las técnicas relacionadas.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım