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