5

我正在尝试使用 curl 从 Internet 获取脚本文件,如下所示:source <( curl url ); echo done,我看到的是在 curl 甚至开始下载文件之前回显了“完成”!

这是实际的命令和输出:

-bash-3.2# source <( curl --insecure https://raw.github.com/gurjeet/pg_dev_env/master/.bashrc ) ; echo done
done
-bash-3.2# % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2833 100 2833 0 0 6746 0 --:--:-- --:--:-- --:--:-- 0

我不太担心在任何事情之前或之后会回显“完成”,我特别担心为什么源命令不会读取并执行脚本!

这个命令在我的 LinuxMint 的 bash 上按预期工作,但在 CentOS 服务器的 bash 上却不行!

4

3 回答 3

11

起初,我没有注意到您使用的是 Bash 3.2。该版本不会来自进程替换,但更高版本(例如 Bash 4)可以。

您可以保存文件并对其进行正常来源:

source /tmp/del

(使用您评论中的文件)

或者,您可以使用/dev/stdin此处字符串和带引号的命令替换:

source /dev/stdin <<< "$(curl --insecure https://raw.github.com/gurjeet/pg_dev_env/master/.bashrc)"; echo done
于 2012-05-10T03:17:29.117 回答
2

尝试这个:

exec 69<> >(:);
curl url 1>&69;
source /dev/fd/69;
exec 69>&-;

这应该迫使您的外壳等待来自管道的所有数据。如果这不起作用,这个将:

exec 69<> >(:);
{ curl url 1>&69 & } 2>/dev/null;
wait $!
source /dev/fd/69;
exec 69>&-;
于 2012-05-09T17:37:16.370 回答
0

Does the following work?

file=$(mktemp)
curl --insecure -o $file https://raw.github.com/gurjeet/pg_dev_env/master/.bashrc 
source $file
rm $file
于 2012-05-12T07:57:25.743 回答