pipe tail output into another script

slthomason picture slthomason · Aug 22, 2012 · Viewed 15.7k times · Source

I am trying to pipe the output of a tail command into another bash script to process:

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

However, when I run it, the $1 parameter (inside the myscript.sh) never gets reached. What am I missing? How do I pipe the output to be the input parameter of the script?

PS - I want tail to run forever and continue piping each individual line into the script.

Edit For now the entire contents of myscripts.sh are:

echo $1;

Answer

chepner picture chepner · Aug 22, 2012

Generally, here is one way to handle standard input to a script:

#!/bin/bash

while read line; do
    echo $line
done

That is a very rough bash equivalent to cat. It does demonstrate a key fact: each command inside the script inherits its standard input from the shell, so you don't really need to do anything special to get access to the data coming in. read takes its input from the shell, which (in your case) is getting its input from the tail process connected to it via the pipe.

As another example, consider this script; we'll call it 'mygrep.sh'.

#!/bin/bash

grep "$1"

Now the pipeline

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

behaves identically to

some-text-producing-command | grep bob

$1 is set if you call your script like this:

./myscript.sh foo

Then $1 has the value "foo".

The positional parameters and standard input are separate; you could do this

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

Now standard input is still coming from the tail process, and $1 is still set to 'foo'.