Linux 环境变量
最近看了一些与linux相关的书籍、文章和文档,想用自己的理解解释一下linux的环境变量。
本文参考内容如下,感兴趣的朋友也可以阅读原文:
linux联机手册页:查询Linux命令
书:Linux命令行(11 -环境)
变量
我的日常开发环境如下:
操作系统:macos
外壳:zsh
可变的
linux中有两种类型的变量:
Shell变量(局部变量):只能在当前shell中使用。
环境变量(全局变量):变量可以传递给子shell。
您可以通过以下两种方式查看定义的变量:
Printenv:没有参数时列出所有环境变量,有参数时列出参数对应的环境变量。
Echo:显示相应的shell变量或环境变量。
外壳变量
在终端中,变量可以以名称=值的形式直接创建:
#等号的左右两边不能有空格。
名称=值
复制代码
您可以通过echo $查看刚刚定义的变量:
echo $name
#值
复制代码
Printenv可以查看定义的环境变量:
#因为name不是环境变量,所以输出内容为空。
printenv名称
复制代码
这样定义的变量只能在当前流程中使用,不能在子流程中使用。
为了验证上面的话,使用bash命令在终端中创建另一个子进程。如您所见,此时再次执行echo $name不会输出任何内容:
➜ ~狂欢
bash-3.2$ echo $name
bash-3.2美元
复制代码
环境变量
如果希望在子流程中使用变量,则需要通过导出来定义变量:
导出名称1 =值1
复制代码
定义的环境变量:
➜~printenv名称1
价值1
➜ ~回声$name1
价值1
复制代码
此时,我们还可以访问子流程中定义的变量:
尝试
bash-3.2$ printenv name1
价值1
bash-3.2$ echo $name1
价值1
复制代码
但是当终端重新打开时,外壳
变量和环境变量将失败,并且无法访问。为了使变量在所有终端永久生效,需要修改配置文件。
,后面会详细描述。
内置环境变量
操作系统中有许多内置的环境变量,可以通过执行printenv:
#一些环境变量
TERM _ SESSION _ ID = w0t0p 0:d35d 538 f-01b 7-407d-AC61-476 CD 68 AE 6e 7
SSH _ AUTH _ SOCK =/private/tmp/com . apple . launchd . 1 goz 8 bcjvc/Listeners
LC _终端_版本=3.4.16
COLORFGBG = 7;0
ITERM _ PROFILE =默认值
XPC _标志=0x0
SHELL=/bin/zsh
_ _ CFBundleIdentifier = com . Google code . ITER m2
UTF-8
TERM_PROGRAM_VERSION=3.4.16
TERM_PROGRAM=iTerm.app
LC_TERMINAL=iTerm2
COLORTERM=truecolor
命令模式=unix2003
路径=/用户/用户名/库/pnpm:/用户/用户名/。bun/bin:/Users/用户名/。nvm/versions/node/v 16 . 14 . 2/bin:/opt/home brew/bin:/opt/home brew/sbin:/Users/username/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/username/。纱线/料仓
复制代码
请注意PATH变量,它定义了目录列表除以:。当用户在终端执行ls等命令时,会在PATH中显示。
找到相应的文件,然后执行它。
作为前端开发者,以我们经常使用的npm为例:
可以看到,npm所在的目录存在于PATH对应的目录列表中,所以我们可以通过终端执行npm命令。其他终端中的可执行命令也是如此。
Node.js中的环境变量(等待批准)
在Node.js中,可以通过process.env访问和修改环境变量:
//访问环境变量
console.log('mock ',process.env.MOCK)
//设置环境变量
process.env.MOCK = '22222 '
复制代码
请注意,当Node.js创建子流程时,默认情况下,环境变量与父流程相同:
从“节点:子进程”导入{ spawn }
console.log('mock ',process.env.MOCK)
process.env.MOCK = '22222 '
const childProcess = spawn('sh ',['-c ',' echo $MOCK'],{ stdio: 'inherit' })
childProcess.on('error ',(err) => {
console.error(错误)
})
复制代码
执行上面的代码MOCK=true npx tsx index.ts,输出如下:
模拟真实
22222
复制代码
外壳初始化文件
每次我们打开终端,shell都会从初始化文件中读取一系列的配置,比如环境变量,别名等。的常见shell初始化文件如下:
文件/etc/profile适用于所有用户的全局配置。/etc/bashrc适用于所有用户的全局配置(专用于bash)~/。zshrc用户的个人zsh配置
用命令cat ~/。zshrc,可以查看配置文件的内容。以下是我的电脑配置文件中的一些代码:
#如果您来自bash,您可能需要更改您的$PATH。
导出路径= $ HOME/bin:/usr/local/bin:$ PATH
#您的oh-my-zsh安装路径。
导出ZSH="$HOME/。哦,我的天"
#设置要加载的主题的名称-如果设置为“随机”,它将
#每次加载oh-my-zsh时加载一个随机主题,在这种情况下,
#要知道加载了哪一个,运行:echo $RANDOM_THEME
#看https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="robbyrussell "
别名cat="pygmentize -g "
复制代码
可以看到,在配置文件中可以执行设置环境变量和别名等一系列操作。
修改配置文件
当然,也可以修改配置文件来实现一些用户自定义的内容。我们可以通过vim命令在命令行中直接修改配置文件。
vim ~/。zshrc
复制代码
例如,我们向配置文件添加一个新的环境变量。
# ...一些其他代码
导出A =测试
复制代码
需要注意的是,这样添加的内容只有在下一次终端重启并再次读取配置文件时才会生效。为了使配置立即生效,请记住执行以下命令:
来源~/。zshrc
#或者。~/.zshrc,两者功能完全一样。
复制代码
执行printenv A,查看是否成功添加了环境变量:
Npm在脚本中执行cli命令
以vite为例。启动项目时,需要在package.json的脚本中配置{dev: "vite"}命令,然后在终端中执行npm run dev,npm。
将执行脚本中与dev相对应的vite命令。
在执行vite命令时,Node.js会将其环境变量PATH设置为node_modules/。bin,也就是在node_modules/.bin中。
在中查找可执行的vite文件。其实现代码如下:
// npm-run-dev.ts
从“节点:子进程”导入{ spawn }
从“节点:url”导入{ fileURLToPath }
从“节点:流程”导入流程
从“节点:路径”导入路径
const _ _ dirname = path . dirname(fileURLToPath(import . meta . URL))
//Core:通过spawn执行sh -c - vite命令,添加。/node_modules/。环境变量的根目录中的bin。
// PATH和cwd要根据自己的目录结构来确定。
const PATH = ` $ { PATH . resolve(_ _ dirname,'../../../', './node_modules/。bin')}:${
process.env.PATH
}`
const ls = spawn('sh ',['-c ','-',' vite'],{
环境:{路径},
cwd: path.resolve(__dirname,'../../../playground/vue-jsx’),
stdio:“继承”
})
ls.on('close ',(code) => {
console.log(`子进程已退出,代码为${code} `)
})
ls.on('error ',(err) => {
console.log('err ',err)
})
复制代码
上面的代码实际上是通过spawn命令中的env来指定命令执行时的环境变量,这样就可以直接运行本地安装的cli了。
。最后,当node_modules/。bin/vite被执行,它将执行真正的vite源代码。
使用tsx执行上述代码,可以达到和npm run dev一样的效果。
标签
本文涉及以下linux命令:
printenv
出口
来源(。)
学习了linux的相关知识,帮助我进一步了解了cli在Node.js中的操作和调试过程,也让我更加精通前端的使用和cli工具的开发。
这是我对linux环境变量的理解。希望这些知识也能帮到你。
本文链接:https://www.kkkliao.cn/?id=241 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。