我的uname -r
(也是我真正的问题,Java 系统属性 os.version)返回一个包含破折号的版本号。它看起来像:5.9.12-gentoo-blah-blah。
这会破坏我正在使用的应用程序,该应用程序不喜欢版本号中的破折号(它只需要一个数字,不允许使用破折号)。
如何更改操作系统的版本号?我只想返回内核版本,其他的不用管。
答案1
操作系统版本由系统调用从内核返回uname
(man 2 uname
有关它的信息有限)。该信息也可以在下面找到/proc/sys/kernel/osrelease
。该文件是只读的,并且在构建内核后无法更改内核的操作系统版本。
Makefile
操作系统版本在内核中设置。前 4 行是:
VERSION =
PATCHLEVEL =
SUBLEVEL =
EXTRAVERSION =
如果您从版本控制存储库进行构建,则也可能在构建过程中添加额外的信息。
Gentoo 的内核添加了一个 EXTRAVERSION,其中包含破折号。在构建内核之前,请修改Makefile
以将版本设置为您想要的版本。
答案2
一种可能的解决方案是使用 LD_PRELOAD 来拦截 uname 系统调用。我找到了一个要旨做这个。
答案3
我希望它有帮助:
创建 bash 文件,例如 my_uname.sh:
#!/usr/bin/env bash
REPLACE_ON="~"
flag=$1
os_uname=$(/usr/bin/uname $flag)
pat="(a|r)"
if [[ "$flag" =~ $pat ]]; then
echo $os_uname | sed "s/-/$REPLACE_ON/g"
else
/usr/bin/uname $flag
fi
观察 PATH 变量以获取新脚本位置
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/13/bin
设置执行标志,并将shell脚本复制到搜索路径
chmod +x my_uname.sh
cp my_uname.sh /usr/local/bin/
之后创建别名:
alias uname=my_uname.sh
您也可以将别名放入 .bashrc 或 .bash_profile
答案4
uname -r
如果您只需要不带破折号的输出并将其作为另一个进程的输入,那么我会使用sed
:
uname -r | sed 's/-//g'
编辑:如果您认为这个答案没有用,请解释原因,以便我可以从您的答案中学习。我们都是来这里学习的,而不仅仅是为了抨击(如果你原谅这个双关语的话)。