Linux 如何从bash中的文件打印env var(不使用源代码)?
许多shell脚本,包括bash概要文件,只是环境变量设置的列表。Debian上的一个这样的脚本是Linux 如何从bash中的文件打印env var(不使用源代码)?,linux,bash,debian,Linux,Bash,Debian,许多shell脚本,包括bash概要文件,只是环境变量设置的列表。Debian上的一个这样的脚本是/etc/os-release,如下所示: while read line; do name=${line%%=*} data=${line#*=} printf -v $name "${data//\"}" done < vars PRETTY\u NAME=“Debian GNU/Linux 10(buster)” NAME=“Deb
/etc/os-release
,如下所示:
while read line; do
name=${line%%=*}
data=${line#*=}
printf -v $name "${data//\"}"
done < vars
PRETTY\u NAME=“Debian GNU/Linux 10(buster)”
NAME=“Debian GNU/Linux”
VERSION_ID=“10”
VERSION=“10(buster)”
版本\代号=buster
ID=debian
主页地址=”https://www.debian.org/"
支持URL=”https://www.debian.org/support"
错误报告URL=”https://bugs.debian.org/"
VERSION\u CODENAME
对于添加到apt源(/etc/apt/sources.list
)尤其有用,例如。请注意,大多数指令都硬编码此值,这可能会导致兼容性问题
因此,我的问题是如何从/etc/os release
等文件中回送版本(例如/VERSION\u CODENAME
)等环境变量而不使用源代码
?这很关键,因为我不想把我的环境变量弄得乱七八糟,只供一次性使用
以下是我知道我现在可以做的,但它会在我当前的环境中留下一些不受欢迎的变量:
source/etc/os发行版&echo“debhttp://httpredir.debian.org/debian/ $VERSION_code name main contrib非免费| sudo tee-a/etc/apt/sources.list”
我想也许有一种方法可以启动一个新的(临时的)bash进程并将变量加载到该环境中。如果没有实际的shell脚本,我无法理解这一点。4个不同的答案。。。
对不起,有多种方法;)。你可能会发现很多其他的方法,但有最合适的(快速、高效、占地面积、可读性…)
1.通过sed导入以填充关联阵列:
2.提取必填字段(再次使用sed
)
当前环境不知道$VERSION\u CODENAME
4.在纯bash中读取变量文件,不带fork
由于我们正在处理一个小文件,我们可以使用loop读取该文件,直到找到所需的信息:
while IFS== read varname value;do
[ "$varname" = "VERSION_CODENAME" ] &&
ImportedVersionCodename=$value && break
done </etc/os-release
echo $ImportedVersionCodename
buster
而IFS==读取varname值;做
[“$varname”=“VERSION\u CODENAME”]&&
ImportedVersionDename=$value&&break
在这里做了4个不同的回答。。。
对不起,有多种方法;)。你可能会发现很多其他的方法,但有最合适的(快速、高效、占地面积、可读性…)
1.通过sed导入以填充关联阵列:
2.提取必填字段(再次使用sed
)
当前环境不知道$VERSION\u CODENAME
4.在纯bash中读取变量文件,不带fork
由于我们正在处理一个小文件,我们可以使用loop读取该文件,直到找到所需的信息:
while IFS== read varname value;do
[ "$varname" = "VERSION_CODENAME" ] &&
ImportedVersionCodename=$value && break
done </etc/os-release
echo $ImportedVersionCodename
buster
而IFS==读取varname值;做
[“$varname”=“VERSION\u CODENAME”]&&
ImportedVersionDename=$value&&break
完成
我想也许有一种方法可以启动一个新的(临时的)bash进程并将变量加载到该环境中
这就是使用括号创建子shell所做的
(
. /etc/os-release
echo "deb http://httpredir.debian.org/debian/ $VERSION_CODENAME main contrib non-free" \
| sudo tee -a /etc/apt/sources.list
)
…只要点击)
,变量就会被删除,因为它们被加载到的子shell将退出
我想也许有一种方法可以启动一个新的(临时的)bash进程并将变量加载到该环境中
这就是使用括号创建子shell所做的
(
. /etc/os-release
echo "deb http://httpredir.debian.org/debian/ $VERSION_CODENAME main contrib non-free" \
| sudo tee -a /etc/apt/sources.list
)
…只要点击)
,变量就会被删除,因为它们加载到的子shell退出。或使用读取和打印f
,如下所示:
while read line; do
name=${line%%=*}
data=${line#*=}
printf -v $name "${data//\"}"
done < vars
读行时;做
名称=${line%%=*}
数据=${line#*=}
printf-v$name“${data/\”}”
完成
或使用阅读和printf
如下:
while read line; do
name=${line%%=*}
data=${line#*=}
printf -v $name "${data//\"}"
done < vars
读取行时;执行以下操作
名称=${line%%=*}
数据=${line#*=}
printf-v$name“${data/\”}”
完成
下一个函数仅使用键(单引号中的值)来生成行
当环境中不需要var时,使用
my_set2() {
configfile="$1"
key="$2"
sed -n "s/^${key}=//p" "${configfile}"
}
echo "deb http://httpredir.debian.org/debian/ $(my_set2 /etc/os-release VERSION_CODENAME) main.."
下一个函数仅使用键(单引号中的值)来生成行
当环境中不需要var时,使用
my_set2() {
configfile="$1"
key="$2"
sed -n "s/^${key}=//p" "${configfile}"
}
echo "deb http://httpredir.debian.org/debian/ $(my_set2 /etc/os-release VERSION_CODENAME) main.."
这里引号的使用是一个关键的细节:它意味着你的值是在shell语法中,所以它们实际上是由shell执行的(就像源代码那样)。你考虑过(/etc/os release&&…
),所以当你点击)时变量就消失了?涵盖了这一点,但需要遵守类似shell的引用。我们有另一个副本,我只是在寻找它。顺便说一句,source/etc/os发行版
默认情况下不创建环境变量;它创建shell变量<代码>导出
是将shell变量转换为环境变量所必需的。感谢@CharlesDuffy提供的所有有用信息。我主要是通过在bash上的实验自学的,因此这些术语上的区别非常有用这里引用的使用是一个关键的细节:这意味着你的值是在shell语法中,所以它们实际上是由shell执行的(正如源代码所做的)。你考虑过(/etc/os-release&&…
),所以当你点击)
时,变量就消失了?涵盖了这一点,但需要遵守类似shell的引用。我们有另一个副本,我只是在寻找它。顺便说一句,source/etc/os发行版
默认情况下不创建环境变量;它创建shell变量<代码>导出
是将shell变量转换为环境变量所必需的。感谢@CharlesDuffy提供的所有有用信息。我主要是通过在bash上的实验自学的,因此这些术语上的区别真的很有帮助。[key]=value
字符串都是(包括[
,]
和=
;OBV.,key
和value
都是数据)时,这一点得到了充分的支持数据而不是c