管尾输出到另一个脚本

slt*_*son 8 parameters bash pipe tail

我试图将tail命令的输出传递到另一个bash脚本来处理:

tail -n +1 -f your_log_file | myscript.sh
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,$ 1参数(在myscript.sh中)永远不会到达.我错过了什么?如何管道输出作为脚本的输入参数?

PS - 我希望tail能够永远运行并继续将每一行连接到脚本中.

编辑 现在myscripts.sh的全部内容是:

echo $1;
Run Code Online (Sandbox Code Playgroud)

che*_*ner 15

通常,这是处理脚本标准输入的一种方法:

#!/bin/bash

while read line; do
    echo $line
done
Run Code Online (Sandbox Code Playgroud)

这是一个非常粗糙的bash相当于cat.它确实展示了一个关键事实:脚本中的每个命令都从shell继承了它的标准输入,所以你真的不需要做任何特殊的事情来访问进来的数据.read从shell获取它的输入,你的情况)从tail通过管道连接到它的过程获得输入.

另一个例子,考虑这个脚本; 我们称之为'mygrep.sh'.

#!/bin/bash

grep "$1"
Run Code Online (Sandbox Code Playgroud)

现在是管道

some-text-producing-command | ./mygrep.sh bob
Run Code Online (Sandbox Code Playgroud)

行为与...相同

some-text-producing-command | grep bob
Run Code Online (Sandbox Code Playgroud)

$1 如果您像这样调用脚本,则设置为:

./myscript.sh foo
Run Code Online (Sandbox Code Playgroud)

然后$1有值"foo".

位置参数和标准输入是分开的; 你可以做到这一点

tail -n +1 -f your_log_file | myscript.sh foo
Run Code Online (Sandbox Code Playgroud)

现在标准输入仍然来自tail过程,$1仍然设置为'foo'.