linux - Linux 环境变量的范围
问题描述
有人可以在以下 4 个示例中解释环境变量范围的差异吗?
❯❯❯ b=1 echo $b
❯❯❯ b=1; echo $b
1
❯❯❯
❯❯❯ cat gen.sh
#!/bin/bash
echo $a
❯❯❯
❯❯❯ a=1 ./gen.sh
1
❯❯❯ a=1; ./gen.sh
解决方案
$parameters 的扩展是在执行命令之前使用当前环境完成的。
分配参数不会自动将其导出到子进程(命令),而只会在随后调用命令时(在其命令行中,根据规则 #1)。
但是,“a=b 命令”形式的命令具有导出到命令的分配,但只是暂时的 - 仅用于单个命令调用。
鉴于上述三个规则:
❯❯❯ b=1 回声 $b
首先翻译为: b=1 echo ""
... 并且什么也不打印。
❯❯❯ b=1; 回声 $b
有效,因为有两个不同的命令,就好像它们放在两条不同的行上一样。第一个是展开并设置一个变量;然后第二个被扩展。
#!/bin/bash
echo $a
(此脚本打印在环境中找到的 $a)。
❯❯❯ a=1 ./gen.sh
这是有效的,因为 a=1 被导出,所以 gen.sh 在环境中找到它。
❯❯❯ a=1; ./gen.sh
这不起作用,因为设置了 a=1 但未导出到子进程;所以 gen.sh 启动但在环境中找不到 $a 。以下将起作用:
❯❯❯导出a=1;./gen.sh
推荐阅读
- asp.net-mvc - Bootstrap 4 - Scrollspy 在 MVC Core 中不起作用
- node.js - Socket.io 中的“socket”是什么意思?
- java - 仅当作为参数传递的 List 具有元素时才考虑 JPA 'where in'
- android - 如何平滑导航抽屉的移动?
- python - Pandas:没有要从文件中解析的列
- javascript - 多个文件上传到 s3 node.js
- svn - Teamcity 9x 错误:找不到有效的 AspnetMergePath
- c++ - 阻塞的互斥锁有多贵?
- postgresql - 使用 Vapor 3 检查应用程序是否有最新数据
- powershell - Powershell NAS 命令不起作用