当前位置:首页 > 文章 > 正文内容

Linux 环境变量

廖万里3年前 (2022-11-06)文章70356

最近看了一些与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 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


“Linux 环境变量” 的相关文章

“双11”,如何守住钱袋子?

“双11”,如何守住钱袋子?

“双十一”快到了,“剁手”的大斧已高高举起。购物车收藏83件,有的商品开启定价预售模式小姐姐的化妆品要不少钱呀,也不知比平时便宜多少最近几天,同事们都在热议“双十一”。 今年的“双十一”跟以往相比有新变化,比如,缩短预售时间、扩容购物车、差价一键退,不少平台还从晚上8点开始销售等。自从2009年开始...

四川公务员考试 真题_福建省选调生考试书籍

四川公务员考试 真题_福建省选调生考试书籍

而在四川的国家公务员考试中,行测中的言语理解题目甚至占到了40道题。所以,很多时候,你会听到“得言语者得行测”就是在强调言语理解在四川公务员考试行测中的重要...2019年四川省省考已进入备考阶段,刷历年省考真题可提升巩固管家整理了33套行测申论四川历练真题,带答案解析需要的同学,看下方图片领取方式...

华为梅开二度:鸿蒙3.0正式版推送+5.5G网络,网友:遥遥领先

华为梅开二度:鸿蒙3.0正式版推送+5.5G网络,网友:遥遥领先

对于华为手机来说,虽然手机业务受到了很大的压力,但是华为在很多领域的表现都不差,无论是汽车领域还是通信领域,都有着不错的市场表现力。而且这几年的华为在技术研发方面的投入资金也不小,这也意味着进步很大。而且从目前的市场角度来看,华为也迎来了梅开二度的情况,不仅针对鸿蒙OS3.0正式版进行了推送和变化,...

6G专利申请量比拼:美国占比35.2%,日本占比9.9%,中国排第几?

6G专利申请量比拼:美国占比35.2%,日本占比9.9%,中国排第几?

5G对于现在的人们来说已经不是什么神秘的存在,很多国家通过近些年的研究都已经逐步掌握了5G技术。不过就5G技术发展的成熟度、设备完善程度以及信号铺设范围来说,我国都是当之无愧的世界第一。但是随着科技技术的不断发展,对于6G的技术研发也被提上日程。不少国家都开始攻克6G技术,并取得了各项专利。根据有关...

骁龙8和骁龙8+的日常体验,到底有多大差距?

骁龙8和骁龙8+的日常体验,到底有多大差距?

机哥写过一篇文章。主要呢,就是盘点了今年那些跳水比较严重的旗舰手机。像什么OPPO Find X5 Pro天玑版啊、小米12 Pro啊、一加10 Pro啊等等。相比起刚上市时定价,现在这些机型,普遍的降价幅度都超过了2000块。原本是卖5000多,现在却只卖3000多。。机哥当时发完文章,底下很大一...

如何让自己的努力更有效率?

如何让自己的努力更有效率?

收到了某个朋友发来的困惑咨询,抽象出来后整理出如下问题:为何自己很努力但觉得没有成长,做了很多事情却感觉没有核心竞争力,有浑身的精力不知道该往何处发力,应该如何破局?我是一名技术型产品经理,已经工作了3年,但是感觉自己陷入了成长迷茫期。 团队很重视技术,我花了很多时间来弥补技术知识,但是发现干不过研...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。