处理来自管道的输入的函数

Hed*_*dge 4 bash shell

我正在尝试编写一个bash函数来返回一个特定的管道输出行.目前,完整命令如下所示:

mdfind 'my_search_string' | sed "2q;d"
Run Code Online (Sandbox Code Playgroud)

这将返回mdfind-command的第二行输出.

我试图sed "$1q;d"变成一个被指定为别名的函数.

如何处理管道输入?

kon*_*box 7

要返回第二行输出,请执行以下操作:

... | sed -ne 2p
Run Code Online (Sandbox Code Playgroud)

并将其用作功能:

function print_2nd_line {
    sed -ne 2p
}

mdfind 'my_search_string' | print_2nd_line
Run Code Online (Sandbox Code Playgroud)

您也可以根据需要选择较短的名称p2.

该功能也可以自定义为能够从指定的文件打印第二行,如:

function print_2nd_line {
    sed -ne 2p -- "$@"
}

print_2nd_line file
... | print_2nd_line  ## Still could be used like this.
Run Code Online (Sandbox Code Playgroud)

顺便说一下,更高效的版本将是

sed -ne '2{p;q}'
Run Code Online (Sandbox Code Playgroud)

UPDATE

正如Charles Duffy所建议的那样,您也可以将此格式用于POSIX兼容性.实际上它也与基于原始System V sh的所有外壳兼容.

print_2nd_line() {        
    sed -ne '2{p;q}' -- "$@"
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您想将自定义行号传递给您的函数,您可以:

print_2nd_line() {
    N=$1; shift
    sed -ne "${N}{p;q}" -- "$@"
}
Run Code Online (Sandbox Code Playgroud)

在哪里可以运行它:

... | print_2nd_line 2  ## Still could be used like this.
Run Code Online (Sandbox Code Playgroud)

要么

print_2nd_line 2 file
Run Code Online (Sandbox Code Playgroud)

  • 只有一个狡辩 - "function"关键字实际上弊大于利,打破了POSIX兼容性,同时没有任何好处.最好不要理会:`print_2nd_line(){...}` (4认同)