Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从bash中的文件打印env var(不使用源代码)?_Linux_Bash_Debian - Fatal编程技术网

Linux 如何从bash中的文件打印env var(不使用源代码)?

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

许多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=“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