将流传递给 bash 函数

use*_*118 5 bash

我需要创建一个bash可以将流传递给 NOT A FILE的函数。这是函数:

ff() { cat /etc/group | fgrep -f "$1" ;}
Run Code Online (Sandbox Code Playgroud)

当我像这样运行它时:

ff <( echo some_user )
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

fgrep: /dev/fd/63: No such file or directory
Run Code Online (Sandbox Code Playgroud)

代替:

some_user:x:0:
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

那将是bash. 不知何故,bash关闭文件描述符 63,这echo是在执行之前写入的管道的读取端fgrep。

zsh或者ksh93没有那个限制。

在这种情况下,您无论如何都不需要这两个进程:

ff() { fgrep -f "$1" < /etc/group; }
Run Code Online (Sandbox Code Playgroud)

在一般情况下,您可以使用另一个 shell 或通过以下方式解决bash限制:

ff() { sh -c 'cat /etc/group | fgrep -f "$1"' sh "$1";}
Run Code Online (Sandbox Code Playgroud)

或者:

ff() { cat /etc/group | fgrep -f /dev/fd/3;} 3<"$1"
Run Code Online (Sandbox Code Playgroud)