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

Linux 环境变量

廖万里2年前 (2022-11-06)文章70274

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

分享到:

添加博主微信共同交流探讨信息差网赚项目: 19528888767 , 请猛戳这里→点我添加

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

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

不打游戏只看视频,骁龙和天玑竟然能拉开这么大差距?

不打游戏只看视频,骁龙和天玑竟然能拉开这么大差距?

事情是这样的。最近托尼有位同事因为之前被使用三星 4nm 工艺的骁龙 8 Gen 1 折腾怕了,所以他在把原来的旧手机卖了之后,转手换了台搭载天玑 9000 的手机。一开始他对这台手机可以说非常满意,打游戏时发热终于没那么严重了,然而时间一长,他发现手机电量貌似掉的有点快,续航并没有想象中那么顶。本...

马斯克倡议设台湾特别行政区,台地区专家:不希望台海冲突,反映商人普遍心声

马斯克倡议设台湾特别行政区,台地区专家:不希望台海冲突,反映商人普遍心声

 美国电动车大厂特斯拉公司创办人马斯克针对台海紧张局势,提出中国将台湾地区设为“特别行政区”方案。彰化师范大学创意创新创业研究中心主任王信文接受香港中评社访问表示,特斯拉电动车有75%的供应链来自台湾,马斯克当然不希望台海冲突,波及商业发展,这某方面也反映商人普遍心声,商人会作此呼吁,代表已嗅到战争...

华为梅开二度:鸿蒙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技术,并取得了各项专利。根据有关...

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

步步高创始人段永平,高手有所为有所不为,35条深度思考值得收藏

段永平,一个注定在商业史无法被忽视的存在。段永平的经历可谓传奇。他是国内第一个拍下来股神巴菲特午餐的男人,那时候他还带上了现在拼多多的创始人黄铮。而这个一手创办了小霸王、步步高等著名企业,并与Vivo、OPPO、一加和拼多多有着千丝万缕联系的企业家,这位通过投资网易、腾讯和苹果而获利颇丰的投资者,也...

特斯拉再降价,为何受伤最大的不是比亚迪?

特斯拉再降价,为何受伤最大的不是比亚迪?

特斯拉降价算新闻吗?素有“韭菜收割机”之称的特斯拉,不论涨价或者降价都是再普通不过的常规操作,但是这一次,轻轻松松就闯上了热搜。降一次价,上一次热搜?当然这一方面,是因为本次降价幅度不小,Model 3官降1.3万到1.8万元不等,主销车型Model Y最高降幅甚至达到3.7万元。就算结合客观情况,...

发表评论

访客

看不清,换一张

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