该函数将使用 cURL 或 wGet 下载脚本并使用附加参数执行它:
wexec() {
url=$1
shift
if command -v "curl" >/dev/null 2>&1; then
curl -s $url | bash -s -- $@
elif command -v "wget" >/dev/null 2>&1; then
wget -qO- $url | bash -s -- $@
else
echo "No curl or wget found."
return 1
fi
}
我想从服务器下载并运行以下脚本,并使用传递的参数在本地运行它:
#!/usr/bin/env bash
hello() {
echo Hello World!
}
echo Arguments: $@
我也希望该hello
函数在本地环境中可用,但事实并非如此,因为我在子shell new shell中定义了它,所以调用wexec http://example.org/my-remote-script.sh a1 a2 a3; hello
将成功输出Arguments: a1 a2 a3
,但失败并显示hello: command not found
.
有没有办法从本地环境发送参数并仍然从远程脚本接收函数?
答案1
看来当前的函数参数会自动传递给源脚本,所以我可以这样做:
wexec() {
url="$1"
shift
if command -v "curl" >/dev/null 2>&1; then
\. /dev/stdin <<< "$(curl -s "$url")"
elif command -v "wget" >/dev/null 2>&1; then
\. /dev/stdin <<< "$(wget -qO- "$url")"
else
echo "No curl or wget found." >&2
return 1
fi
}
这实在是太令人惊讶了。
我还必须从中获取资源/dev/stdin
才能使其在 macOS 上也能运行。