Bash 将尾部输出导入另一个脚本

Bash 将尾部输出导入另一个脚本,bash,parameters,pipe,tail,Bash,Parameters,Pipe,Tail,我正在尝试将tail命令的输出通过管道传输到另一个bash脚本以进行处理: tail -n +1 -f your_log_file | myscript.sh 但是,当我运行它时,永远不会到达$1参数(在myscript.sh中)。我错过了什么?如何通过管道将输出作为脚本的输入参数 PS-我希望tail永远运行,并继续将每一行管道化到脚本中 编辑 目前,myscripts.sh的全部内容如下: echo $1; 通常,这里有一种处理脚本标准输入的方法: #!/bin/bash while

我正在尝试将tail命令的输出通过管道传输到另一个bash脚本以进行处理:

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

PS-我希望tail永远运行,并继续将每一行管道化到脚本中

编辑 目前,myscripts.sh的全部内容如下:

echo $1;

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

#!/bin/bash

while read line; do
    echo $line
done
这是一个相当于
cat
的非常粗糙的bash。它确实演示了一个关键事实:脚本中的每个命令都从shell继承其标准输入,因此您实际上不需要做任何特殊的事情来访问传入的数据
read
从shell获取输入,shell(在您的例子中)从通过管道连接到它的
tail
进程获取输入

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

#!/bin/bash

grep "$1"
现在管道

some-text-producing-command | ./mygrep.sh bob
行为与

some-text-producing-command | grep bob

$1
是在如下方式调用脚本时设置的:

./myscript.sh foo
然后,
$1
的值为“foo”

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

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

现在标准输入仍然来自
tail
过程,并且
$1
仍然设置为“foo”。

也许您的输入与
awk
混淆了

tail -n +1 -f your_log_file | awk '{
    print $1
}'
将打印tail命令输出的第一列

在外壳中,可通过以下方式实现类似效果:

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

或者,您可以在。。。管道将一个进程的输出(
stdout
)连接到另一个进程的输入(
stdin
stdin
与进程启动时发送给进程的参数不同

您要做的是将第一个进程的输出中的行转换为第二个进程的参数。这正是命令的作用

您所需要做的就是在初始命令之间插入一个
xargs
,它将工作


tail-n+1-f|log|u文件| xargs | myscript.sh

缺少一个要分配给
$1
的参数。管道将tail的输出连接到脚本的标准输入。您能否发布
myscript.sh
,或者至少足以确定您是否需要一个参数(以及该参数应该是什么),以及它将如何处理其标准输入上显示的数据。我不确定是否遵循。foo来自何处/正在填充?“foo”只是命令行上的任意字符串。如果您的命令后面有一个字符串,这就是分配给
$1
的字符串。如果有第二个字符串,则将其分配给
$2
,依此类推。在最初的示例中,
myscript.sh
之后没有参数,这就是为什么
$1
没有值的原因。对-那么如何将tail的输出导入myscript.sh呢?我是否要将它合并到myscript.sh中?如果是,如何执行?脚本中任何从标准输入读取的命令都将从管道中读取。在管道中运行我答案顶部的示例脚本,看看它是如何工作的。@chepner,对于
cat
等价物,循环应该有
echo“$line”
,而不是
echo-n“$line”