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;
Perhaps your were confused with
awk
?would print the first column from the output of the tail command.
In the shell, a similar effect can be achieved with:
Alternatively, you could put the whole
while ... done
loop insidemyscript.sh
Generally, here is one way to handle standard input to a script:
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 thetail
process connected to it via the pipe.As another example, consider this script; we'll call it 'mygrep.sh'.
Now the pipeline
behaves identically to
$1
is set if you call your script like this:Then
$1
has the value "foo".The positional parameters and standard input are separate; you could do this
Now standard input is still coming from the
tail
process, and$1
is still set to 'foo'.Piping connects the output (
stdout
) of one process to the input (stdin
) of another process.stdin
is not the same thing as the arguments sent to a process when it starts.What you want to do is convert the lines in the output of your first process into arguments for the the second process. This is exactly what the xargs command is for.
All you need to do is pipe an
xargs
in between the initial command and it will work:tail -n +1 -f your_log_file | xargs | myscript.sh