使用 bash 命令的最新版本的 libssh2 和 libssl2?
Latest version of libssh2 and libssl2 using bash command?
我正在尝试使用自己的 bash 脚本参考 https://github.com/Frugghi/iSSH2 来为苹果平台生成 libssl 和 libssh 库。我想尝试自己的 bash 脚本的原因是获取最近的库并保持更新。
我有两个 bash 脚本来检测 openssl 和 libssh2 库的最新版本:
getLibssh2Version () {
if type git >/dev/null 2>&1; then
LIBSSH_VERSION=`git ls-remote --tags https://github.com/libssh2/libssh2.git | egrep "libssh2-[0-9]+(\.[0-9])*[a-zA-Z]?$" | cut -f 2 -d - | sort -t . -r | head -n 1`
LIBSSH_AUTO=true
}
和
getOpensslVersion () {
if type git >/dev/null 2>&1; then
LIBSSL_VERSION=`git ls-remote --tags git://git.openssl.org/openssl.git | egrep "OpenSSL(_[0-9])+[a-zA-Z]?$" | cut -f 2,3,4 -d _ | sort -t _ -r | head -n 1 | tr _ .`
LIBSSL_AUTO=true
}
但是第一个脚本获取的是 1.9.0 版本的 Libssh2 而不是 1.10.0 ,第二个脚本获取的是 1.1.1n 系列的 OpenSSL 而不是 3.0.2 。我猜这与定义的正则表达式有关。有人可以解决这个脚本错误吗?
在您的第一个片段中:
- 您正在用
(\.[0-9])*
过滤 egrep
中的 1.10.0
版本,应该是 (\.[0-9]+)*
.
- 对于这些子修订版的数字排序,
sort
需要更多选项:-t. -k 1,1n -k 2,2n
- 我已经切换到不进行反向排序,而是使用
tail
而不是 head
,因为反向排序在某种程度上不适用于其他选项(至少在我的机器上)。
解决方案:
git ls-remote --tags https://github.com/libssh2/libssh2.git | \
egrep "libssh2-[0-9]+(\.[0-9]+)*[a-zA-Z]?$" | \
cut -f 2 -d - | sort -t. -k 1,1n -k 2,2n | tail -n 1
输出:
1.10.0
在第二个片段中:
- 命名和标点符号从 1.x 版本更改为 3.x 版本,因此它们被
egrep
过滤掉了。我会天真地使用 egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$"
. 而不是 egrep "OpenSSL(_[0-9])+[a-zA-Z]?$"
- 因此,具有
cut
的版本“提取”对于较新的版本失败。自发地,我选择使用 sed 's/.*openssl.//i'
来做同样的事情。
- 我再次从使用
head
切换到 tail
。
- 注意
sort
ing 遇到与第一个片段相同的问题,即当这些子修订开始滚动时,例如从 3.9...
到 3.10...
,您需要添加与上述相同的选项。
解决方案:
git ls-remote --tags git://git.openssl.org/openssl.git | \
egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$" | \
sed 's/.*openssl.//i' | sort -t _ | tail -n 1 | tr _ .
输出:
3.0.2
您需要执行 grep
的 -oP
选项的 Perl 样式正则表达式匹配。
正在获取 libssh2
最新版本。
git ls-remote --tags https://github.com/libssh2/libssh2.git | grep -oP "libssh2-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
正在获取 openssl
最新版本。
git ls-remote --tags git://git.openssl.org/openssl.git | grep -oP "openssl-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
我正在尝试使用自己的 bash 脚本参考 https://github.com/Frugghi/iSSH2 来为苹果平台生成 libssl 和 libssh 库。我想尝试自己的 bash 脚本的原因是获取最近的库并保持更新。
我有两个 bash 脚本来检测 openssl 和 libssh2 库的最新版本:
getLibssh2Version () {
if type git >/dev/null 2>&1; then
LIBSSH_VERSION=`git ls-remote --tags https://github.com/libssh2/libssh2.git | egrep "libssh2-[0-9]+(\.[0-9])*[a-zA-Z]?$" | cut -f 2 -d - | sort -t . -r | head -n 1`
LIBSSH_AUTO=true
}
和
getOpensslVersion () {
if type git >/dev/null 2>&1; then
LIBSSL_VERSION=`git ls-remote --tags git://git.openssl.org/openssl.git | egrep "OpenSSL(_[0-9])+[a-zA-Z]?$" | cut -f 2,3,4 -d _ | sort -t _ -r | head -n 1 | tr _ .`
LIBSSL_AUTO=true
}
但是第一个脚本获取的是 1.9.0 版本的 Libssh2 而不是 1.10.0 ,第二个脚本获取的是 1.1.1n 系列的 OpenSSL 而不是 3.0.2 。我猜这与定义的正则表达式有关。有人可以解决这个脚本错误吗?
在您的第一个片段中:
- 您正在用
(\.[0-9])*
过滤egrep
中的1.10.0
版本,应该是(\.[0-9]+)*
. - 对于这些子修订版的数字排序,
sort
需要更多选项:-t. -k 1,1n -k 2,2n
- 我已经切换到不进行反向排序,而是使用
tail
而不是head
,因为反向排序在某种程度上不适用于其他选项(至少在我的机器上)。
解决方案:
git ls-remote --tags https://github.com/libssh2/libssh2.git | \
egrep "libssh2-[0-9]+(\.[0-9]+)*[a-zA-Z]?$" | \
cut -f 2 -d - | sort -t. -k 1,1n -k 2,2n | tail -n 1
输出:
1.10.0
在第二个片段中:
- 命名和标点符号从 1.x 版本更改为 3.x 版本,因此它们被
egrep
过滤掉了。我会天真地使用egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$"
. 而不是 - 因此,具有
cut
的版本“提取”对于较新的版本失败。自发地,我选择使用sed 's/.*openssl.//i'
来做同样的事情。 - 我再次从使用
head
切换到tail
。 - 注意
sort
ing 遇到与第一个片段相同的问题,即当这些子修订开始滚动时,例如从3.9...
到3.10...
,您需要添加与上述相同的选项。
egrep "OpenSSL(_[0-9])+[a-zA-Z]?$"
解决方案:
git ls-remote --tags git://git.openssl.org/openssl.git | \
egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$" | \
sed 's/.*openssl.//i' | sort -t _ | tail -n 1 | tr _ .
输出:
3.0.2
您需要执行 grep
的 -oP
选项的 Perl 样式正则表达式匹配。
正在获取 libssh2
最新版本。
git ls-remote --tags https://github.com/libssh2/libssh2.git | grep -oP "libssh2-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"
正在获取 openssl
最新版本。
git ls-remote --tags git://git.openssl.org/openssl.git | grep -oP "openssl-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"