我有一个自解压的 bash 脚本(二进制数据附加到末尾),如下所示:
#!/bin/bash
export TMPDIR=$(mktemp -d)
ARCHIVE_START_LINE=$(...) # <omitted>
# extracting data archive into a temporary directory
tail -n+$ARCHIVE_START_LINE $0 | tar xzv -C $TMPDIR
# <ACCESSING_ARCHIVED_RESOURCES>
exit 0
# <BINARY_DATA_ARCHIVE>
脚本远程托管于https://<omitted>/script.sh
我想拉取脚本并在本地执行它。
当我tail
在脚本中将当前文件名作为参数传递时,我无法执行以下操作:
/bin/bash -c "$(curl -fsSL https://<omitted>/script.sh)"
当然我可以先将其保存到临时文件中,例如:
TMP=$(mktemp); curl -fsSL https://<omitted>/script.sh > $TMP; sh $TMP; rm $TMP
但是...有没有更简洁的方法?
答案1
我只需稍微改变脚本的结构,这样你就不需要了tail
。只需将数据保存为变量即可:
#!/bin/bash
## begin data dump
read -r -d '' archive_data <<'EoF'
<BINARY_DATA_ARCHIVE>
EoF
## end data dump
export tmpdir=$(mktemp -d)
# extracting data archive into a temporary directory
printf '%s' "$archive_data" | tar xzv -C "$tmpdir"
exit 0
评论:
\0
如果数据存档可以包含 NUL ( ),则此方法无效。注意 周围的单引号
'EoF'
,这确保 any$
不会扩展为错误的变量名。我还将您的变量改为小写,因为对 shell 变量使用大写是一种不好的做法,因为按照惯例,全局环境变量是大写的,这可能会导致命名冲突和意外错误。对您的变量使用小写,并尽可能将全局环境变量大写。
我改为
mktemp
,mktemp -d
因为您似乎正在尝试创建一个目录,但在没有-d
命令的情况下mktemp
创建一个文件。
你现在应该可以做类似的事情
curl -fsSL https://<omitted>/script.sh | bash