以前我使用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 上打开的匿名管道中读取数据。