Bash Script de Comandos de Redirección/Reutilización de Cómo Lograr Multidireccional Capas de Redirección?

StackOverflow https://stackoverflow.com//questions/9697871

Pregunta

Yo estoy luchando para entender comando redirección/reutilización...

Entiendo que hay la <(...) <(...) la metodología y el $( ... && ... ) técnicas para combinar la salida.Pero la verdad no me totalmente entender cuál es la diferencia (me doy cuenta de que la (...) volcados dentro de un nuevo shell, causando potencialmente saltar dirs y perder los vars que no exportan, pero no estoy seguro de cómo los efectos de la general de la redirección esquema) y todavía estoy muy confundido en cuanto a cómo hacer uno-a-muchos redirección después de ojear más de los ejemplos e instrucciones en:
Avanzadas De Scripting Bash Guía 1
Avanzadas De Scripting Bash Guía 2

Mis propios intentos de jugar con él en su mayoría han resultado en "ambigua redirigir" errores.

Por ejemplo, digamos que quiero hacer un forro dada por el pseudocódigo siguiente

    CMD 1 && CMD 2 && CMD 3 --> (1)  
    CMD 4 (1) --> (2)
    CMD 5 (1) --> CMD 6 --> (3)
    CMD 7 (2) && CMD 8 (3) --> (4)
    CMD 9 (2) --> (5)
    CMD 10 (2) (3) -->(6)
    VAR= echo (4) && echo (5) && echo (6)

O como un proceso de diagrama de

CMD 1 +CMD 2 && CMD 3 
    |\
    | ---> CMD 5 ------> CMD 6-----\
    V                     /         V
    CMD 4 ----------------u--------> CMD 10
     | \                  V           /
     |   -------->CMD 7 + CMD 8      /
     V             |                /
    CMD 9          |               /
      \            |              /
       \           V             /
        --------> VAR <----------

Donde las salidas son designados como -->;de almacenamiento para su reutilización en otro op está dada por -->(#);y la combinación de las operaciones están dadas por &&.

Actualmente tengo ni idea de cómo hacer esto en una sola línea sin código redundante.

Quiero dominar el comando de la redirección para que yo pueda hacer algunos poderosos de una sola línea.

Esperemos que eso es suficientemente claro...Yo podría llegar con una prueba de concepto de ejemplos para los comandos, si usted los necesita, pero el pseudocódigo debe dar la idea.

¿Fue útil?

Solución

En respuesta a tu comentario:

sort <(cd $CURR_DIR && find . -type f -ctime $FTIME) \ 
    <(cd $CURR_DIR && find . -type f -atime $FTIME) \ 
    <(cd $CURR_DIR && find . -type f -mtime $FTIME) | uniq

puede ser escrita como (que creo que es más claro)

(find . -type f -ctime $FTIME && find . -type f -atime $FTIME \
    && find . -type f -mtime $FTIME) | sort | uniq

Tres de los programas que produce "un" o "z" como de salida.Producir una cadena que contiene la ordenada de salida y también la única salida de una sola línea:

mkfifo named_pipe{1,2,3}; (echo z ; echo a ; echo z) > named_pipe1 & \
    tee < named_pipe1 >(sort > named_pipe2) | sort | uniq > named_pipe3 & \
    output=$(echo sorted `cat named_pipe2`; echo unique `cat named_pipe3`); \
    rm named_pipe{1,2,3}

Produce sorted a z z unique a z

Una cosa que usted puede notar acerca de esta solución es que se ha dividido, de modo que cada agrupación de comandos tiene su propia línea.Supongo que lo que estoy diciendo aquí es que los trazadores de líneas uno puede ser fresco, pero a menudo la claridad es mejor.

El mecanismo de cómo funciona esto es el uso de un programa llamado tee y canalizaciones con nombre.Una tubería con nombre es exactamente igual a la de un anónimo de la tubería, por ejemplo. cat words.txt | gzip, excepto que puede ser referenciado desde el sistema de archivos (pero no real de los datos se escriben en el sistema de archivos).Tenga en cuenta que la escritura de una canalización con nombre de bloque hasta que el otro proceso es la lectura de la canalización con nombre.He sido gratuito con el uso de tubos de aquí, sólo así se puede obtener una idea de cómo usarlos.

Tee, según lo observado por los demás, pueden replicar de entrada a varias salidas.

Otros consejos

Hay algún tipo de principio de respuesta a su problema en este post:¿Cómo puedo enviar el stdout de un proceso de múltiples procesos utilizando (preferiblemente sin nombre) tuberías de Unix (o Windows)?

El uso de t y >(comando).Pero tu ejemplo es bastante complejo, y es difícil imaginar una línea de solución, sin almacenamiento temporal (var o archivo), por sólo la combinación de los comandos (el Unix manera, sí!).

Quiero decir, si estás de acuerdo en varios de los comandos de marcha de forma secuencial, puede ser más fácil (pero no va a ser un one-liner ya)...

Incluso la escritura de este tipo de expresión con un lenguaje más complejo (es decir python) sería complicado.

Usted tiene varios problemas a resolver.

  1. Tiene una salida que usted necesita como entrada para varios otros comandos.Usted puede resolver este con tee >(cmd1) | cmd2.Ver esta respuesta: ¿Cómo puedo enviar el stdout de un proceso de múltiples procesos utilizando (preferiblemente sin nombre) tuberías de Unix (o Windows)?

    Una alternativa es crear un archivo.Por lo general prefieren el archivo de enfoque porque permite depurar el script final.Para evitar dejar un lío, crear un trabajo temporal directorio que eliminar con trap "..." EXIT

  2. Es necesario combinar los resultados de varios comandos como la entrada a un único comando.El uso de conchas sub aquí: ( CMD 1 ; CMD 2 ) | CMD 3 combina la potencia de salida de 1 y 2 como entrada para los 3.

  3. Se necesita una mezcla de los dos anteriores.Usted puede crear nuevos descriptores de archivo pero cada uno se puede leer sólo una vez.Uso cat para combinarlos y tee para crear copias.

Este debe ser siempre posible, pero hay un inconveniente:Si algo no funciona o va mal, usted nunca será capaz de encontrar el error.

Por lo tanto:Crear un directorio de trabajo y utilizar los archivos.Si pones esto en /tmp, los datos no se escriben en el disco (en los modernos sistemas Linux, /tmp es un disco ram), este se comportará como tuberías, excepto cuando se tienen grandes cantidades de datos más usted será capaz de mantener la secuencia de comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top