带管道的进给源命令


25

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

source file_name

但是我想做的是这样的:

echo something | source

这不起作用。

Answers:


38

由于source(或.)将文件作为参数,因此您可以尝试:

source <(echo something)

1
很好,谢谢。新年快乐!
Desmond Hume 2014年

@muru这很好用。需要注意的是“|源的/ dev /标准输入”有外表的工作,但它实际上会删除所有变量赋值。不知道为什么。理论上似乎很扎实。太疯狂了
达斯汀·奥普里亚

2
@DustinOprea管道创建一个子外壳,因此所有这些变量分配都不会影响父外壳。
muru

8

您的源命令需要一个文件参数。您可以在某些shell中使用进程替换来获取它,这是因为以相同的方式替换shell ...

arg=$(echo hi)

... echo命令行上带有子外壳程序输出的位,在进行进程替换的情况下,它用命名文件(通常是/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上打开的异物管道读取数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.