2012-08-22 24 views
7

Estoy tratando de canalizar la salida de un comando de la cola en otra escritura del golpe de proceso:tubo en otro script

tail -n +1 -f your_log_file | myscript.sh 

Sin embargo, al ejecutarlo, el parámetro $ 1 (dentro de la myscript.sh) nunca se alcanza. ¿Qué me estoy perdiendo? ¿Cómo canalizo la salida para que sea el parámetro de entrada del script?

PD - Quiero que la cola funcione para siempre y continúe canalizando cada línea individual en la secuencia de comandos.

Editar Por ahora todo el contenido de myscripts.sh son:

echo $1; 
+0

Te estás perdiendo un argumento para asignar a '$ 1'.La tubería conecta la salida de la cola a la entrada estándar de su secuencia de comandos. ¿Puede publicar 'myscript.sh', o al menos lo suficiente para determinar si necesita un argumento (y cuál debería ser ese argumento) y cómo manejará los datos presentados en su entrada estándar. – chepner

Respuesta

13

En general, esta es una manera de manejar la entrada estándar a una secuencia de comandos:

#!/bin/bash 

while read line; do 
    echo $line 
done 

Eso es una muy bash equivalente a cat. Demuestra un hecho clave: cada comando dentro del script hereda su entrada estándar del shell, por lo que no es necesario hacer nada especial para obtener acceso a los datos entrantes. read toma su entrada del shell, que (en su caso) recibe su entrada del proceso tail conectado a través de la tubería.

Como otro ejemplo, considere esta secuencia de comandos; lo llamaremos 'mygrep.sh'.

#!/bin/bash 

grep "$1" 

Ahora la tubería

some-text-producing-command | ./mygrep.sh bob 

comporta de forma idéntica a

some-text-producing-command | grep bob 

$1 se establece si se llama a la secuencia de comandos de esta manera:

./myscript.sh foo 

Luego $1 tiene el valor "foo".

Los parámetros posicionales y la entrada estándar son independientes; usted puede hacer esto

tail -n +1 -f your_log_file | myscript.sh foo 

de entrada estándar Ahora todavía está viniendo del proceso tail y $1 todavía está en 'foo'.

+0

No estoy seguro de seguir. ¿De dónde viene foo proveniente/se está poblando? – slthomason

+0

'foo' es solo una cadena arbitraria en la línea de comando. Si hay una cadena que sigue su comando, eso es lo que se asigna a '$ 1'. Si hay una segunda cadena, eso se asigna a '$ 2', y así sucesivamente. En su ejemplo original, no tenía argumentos después de 'myscript.sh', por lo que' $ 1' no tenía ningún valor. – chepner

+0

a la derecha, entonces, ¿cómo conecto la salida de la cola a myscript.sh? ¿Acabo de incorporarlo a myscript.sh? ¿Si es así, cómo? – slthomason

1

¿Quizás se confundió con awk?

tail -n +1 -f your_log_file | awk '{ 
    print $1 
}' 

imprimiría la primera columna de la salida del comando de cola.

En el shell, un efecto similar puede lograrse con:

tail -n +1 -f your_log_file | while read first junk; do 
    echo "$first" 
done 

Alternativamente, se puede poner a todo el bucle interior while ... donemyscript.sh

Cuestiones relacionadas