使用管道提供源命令

使用管道提供源命令

以前我使用source这样的命令:

source file_name

但我想做的是:

echo something | source

这是行不通的。

答案1

由于source(或.) 将文件作为参数,您可以尝试进程替换:

source <(echo something)

答案2

您的源命令需要文件参数。您可以在某些 shell 中通过进程替换来实现这一点,这是因为 shell 以同样的方式替换...

arg=$(echo hi)

...echo命令行上带有子shell输出的位,在进程替换的情况下,它用命名文件替换子shell - 通常/dev/fd/62或其他东西 - 一些到文件描述符的链接。对于管道,文件描述符是 0 所以......

echo 'echo hi' | . /dev/fd/0

.../dev/stdin或者无论情况如何,在任何 Linux 系统上都应该可以正常工作 - 除此之外还有许多其他系统。您也可以类似地使用此处文档:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

您可以通过以下方式验证 shell 处理进程替换的方式:

(set -x; readlink <(:))

...打印(在bash:

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

...因此我们可以看到 shell 正在执行替换,并readlink从在文件描述符 63 上打开的匿名管道中读取数据。

相关内容