使用管道馈送源命令

Des*_*ume 34 shell pipe

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

source file_name
Run Code Online (Sandbox Code Playgroud)

但我想要做的是:

echo something | source
Run Code Online (Sandbox Code Playgroud)

哪个不起作用。

mur*_*uru 53

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

source <(echo something)
Run Code Online (Sandbox Code Playgroud)

  • @DustinOprea 管道创建一个子外壳,因此所有这些变量赋值永远不会影响父外壳。 (5认同)

mik*_*erv 10

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

arg=$(echo hi)
Run Code Online (Sandbox Code Playgroud)

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

echo 'echo hi' | . /dev/fd/0
Run Code Online (Sandbox Code Playgroud)

.../dev/stdin或任何情况下应该在任何Linux系统上都可以正常工作 - 以及其他许多系统。您也可以类似地使用 here-documents:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您可以验证您的 shell 处理进程替换的方式:

(set -x; readlink <(:))
Run Code Online (Sandbox Code Playgroud)

...打印(in bash)

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]
Run Code Online (Sandbox Code Playgroud)

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