gpt4 book ai didi

bash - 从管道获取参数

转载 作者:行者123 更新时间:2023-11-29 08:54:05 27 4
gpt4 key购买 nike

考虑从管道中获取结果:

find .

现在我想在管道后面的第二个命令中访问实际通过管道传输(输入)的内容,然后例如将其打印两次。

find . | printf $arg$arg\n
#each filename would be printed twice per line

请注意,问题不是询问打印两次从管道中获取的内容,我知道如何使用 bash for 循环或编写可以完成上述操作的脚本。 如何让 $arg 在内联脚本中快速使用它?

$0 和 $1 不像它们在脚本文件中那样工作。

最佳答案

忽略文件名包含换行符的可能性,您可以使用sed 作为pringley建议在他的answer ,或者您可以使用 read 命令创建一个 while 循环:

find . |
while read -r line
do
echo "$line$line"
done

(-r 用于“原始”输入;它阻止 shell 在输入中扩展反斜杠转义序列,并且是 read 命令的标准 POSIX 功能在外壳中。)

由于您提到了 bash,您可以通过使用 find 来避免文件名中的换行符问题。 -print0 选项以空字节(C 中的 '\0')而不是换行符终止每个名称,然后使用:

find . -print0 |
while read -r -d '' line
do
echo "X${line}${line}X"
done

-d '' 将普通的换行符替换为字符串参数的第一个字符,但字符串为空,因此第一个字符是唯一的空字节字符。

没有一种简单的方法(据我所知,也不是一种困难的方法)按照以下行使用 for 循环:

for line in $(find .)
do
echo "X${line}${line}X"
done

对于其中包含空格或换行符的名称,它可以可靠地工作。

通常,您可能想使用 xargs 命令。这会读取标准输入并使用从标准输入中读取的内容作为命令的参数来创建命令行。

find . | xargs wc -l

或者,使用换行符和空格安全(默认情况下,xargs 在空格、制表符和换行符处拆分参数):

find . -type f -print0 | xargs -0 wc -l

xargs 有很多选项可以应用——尤其是 GNU 版本。

但是,您还可以选择 find,这在很大程度上使 xargs 变得多余:

find . -type f -exec wc -l {} +

find 的工作基本相同。 -打印0 | xargs -0 wc -l 命令。一个区别是,如果 find 的输出中没有文件,则使用 -exec 根本不会执行 wc,而通过默认情况下,xargs 将执行一次(没有文件名参数;这是为了符合 POSIX)。使用 GNU xargs,您可以使用 -r--no-run-if-empty 来阻止这种情况发生。 Mac OS X xargs 似乎无论如何都会这样做。

关于bash - 从管道获取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17847103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com