Bash的源命令不能处理来自互联网的文件

时间:2012-05-09 16:53:59

标签: bash shell url

我正在尝试使用curl从互联网上获取脚本文件,如下所示:source <( curl url ); echo done,我看到'完成'在之前回显卷曲甚至开始下载文件!

这是实际的命令和输出:

-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

我并不太担心'done'在任何事情之前或之后被回应,我特别担心为什么源命令不能读取并对脚本采取行动!

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

3 个答案:

答案 0 :(得分:9)

起初,我没有注意到你正在使用Bash 3.2。该版本不会从流程替换中获取,但是后来的版本如Bash 4会这样做。

您可以保存文件并执行正常的文件来源:

source /tmp/del

(使用评论中的文件)

或者,您可以使用/dev/stdin和here-string以及带引号的命令替换:

source /dev/stdin <<< "$(curl --insecure https://raw.github.com/gurjeet/pg_dev_env/master/.bashrc)"; echo done

答案 1 :(得分:2)

试试这个:

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

这应该强制你的shell等待来自管道的所有数据。如果这不起作用,那么这个将:

exec 69<> >(:);
{ curl url 1>&69 & } 2>/dev/null;
wait $!
source /dev/fd/69;
exec 69>&-;

答案 2 :(得分:0)

以下是否有效?

file=$(mktemp)
curl --insecure -o $file https://raw.github.com/gurjeet/pg_dev_env/master/.bashrc 
source $file
rm $file