Linux的Shell变量、环境变量、代理设置

2023-10-26

引言

其实这篇文章和上一篇klash都是最近在做的一件事情的笔记,把学到的东西整理了一下思维导图,供大家参考。
在这里插入图片描述

一、 shell与shell变量、环境变量

在这里插入图片描述

1.1 概念

  • 当通过诸如 XShell、PuTTY 等软件远程登录 Linux 时,出现的黑窗口终端就是 shell。一个 Shell 窗口相当于创建了一个 Shell 进程。打开多个 Shell 窗口会创建多个独立的 Shell 进程,它们之间互不影响,并拥有不同的进程 ID。
  • shell变量可以配置脚本中的各种参数和选项,使脚本更加灵活。例如可以使用Shell变量来存默认参数,然后在执行命令时使用$变量名作为命令参数。
  • 环境变量一般与系统功能配置相关,适用于需要跨进程传递参数的情况。例如PATH环境变量用于指定可执行文件的路径。当用户执行命令时,系统会在PATH的路径中查找该命令对应的文件执行;http_proxy环境变量用于指定HTTP协议的代理服务器地址和端口号,当用户使用curl、wget等命令下载时,这些工具会通过http_proxy环境变量指定的代理联网。
  • 变量不区分大小写,比如http_proxyHTTP_PROXY是一个东西。

1.2 作用域

  • Shell 变量仅在当前 shell 进程中可见和访问。比如在 shell 中执行 my_var=123 后,在 shell 中使用 echo $my_var 可以输出 123,但如果运行一个内容为 echo $my_var 的 .sh 脚本,则不会有任何输出。
  • 环境变量可以被当前进程及其子进程访问。与上述情况相反,当使用 export my_var=123 后,如果在脚本中运行一个子进程,则该子进程也可以访问该变量。
  • 在Docker中,如果宿主机设置了http_proxy,那么Docker里面的线程不会自动使用代理。需要在Dockerfile中添加ENV http_proxy $http_proxyENV https_proxy $https_proxy,这样Docker容器就可以使用宿主机的代理了。
  • 如果在脚本中使用source命令或.命令来执行脚本,则该脚本中定义的变量会被当前shell进程所继承和使用。

1.3 SSH 连接 Linux 服务器的环境变量处理流程

  1. SSH 连接到远程 Linux 服务器并进行身份验证,成功后用户登录到服务器的 shell 环境中。
  2. 根据用户的 shell 类型,分别从 /etc/environment/etc/profile 读取系统级别的环境变量
  3. 根据登陆的用户,在 ~/.bash_profile~/.profile~/.bashrc 读取用户级别的环境变量。
  4. 用户可以在登录后手动设置或修改环境变量,例如通过 export 命令设置 PATH 环境变量。
  5. 当用户从 SSH 客户端断开连接时,shell 环境也会随之结束。
  • 上述过程中,后面的环境变量定义会覆盖前面的定义
  • 如果使用类似tmux或screen等会话管理工具,那么在同一个会话中所有的窗口都共享同一个shell环境,因此在其中修改或设置的环境变量会影响到其他窗口和进程。

1.4 环境变量文件

  • 用户级别

    • ~/.bashrc~/.bash_profile~/.profile 在每次打开shell时都会执行,伴有环境变量设置。
    • 并不是全部执行,而是在不同场景下选择性执行的。~/.bash_profile 在登录 shell 中执行,如果这个文件不存在,那么会尝试执行 ~/.profile~/.bashrc 文件通常在交互式非登录 shell 中执行,但是很多用户在 ~/.bash_profile~/.profile 中加入了执行 ~/.bashrc 的命令。
    • 用于方便地为不同用户做配置,隔离不同用户的环境变量。
  • 系统级别

    • /etc/environment 是一个系统级别的环境变量文件,在登录时为所有用户设置环境变量,无论使用哪种shell。
    • 登录时用户的 shell 会读取 /etc/environment 文件中的变量,并将其作为用户的环境变量设置。当用户使用sudo命令切换到root用户时,也会读取 /etc/environment 文件中的变量。
    • 只对shell运行的进程有效,对于一些不依赖shell环境的应用程序,如 Apache、Nginx 等,则需要修改对应应用程序的配置文件。

二、变量增删改查

在这里插入图片描述

2.1 查看变量

  • 查看单个变量:echo $VAR
  • 查看所有 Shell 变量:set
  • 查看所有 Environment 变量:env

2.2 设置/修改变量

  • Shell 变量:VAR=valuedeclare VAR=value,都是设置局部变量
  • Environment 变量:export VAR=value

2.3 删除变量

  • 删除 Shell 变量:unset VAR
  • 删除 Environment 变量:export -n VAR

2.4 source命令快速设置环境变量

  • source 命令的作用是执行 shell 脚本文件(如 .sh),将文件里的环境变量、函数等导入当前 shell 环境中。
  • 仅影响当前shell,不会在其他shell中生效
  • 也可以使用 . 命令来代替 source 命令。比如source abc.sh 可以写成 . abc.sh。

三、在Linux上配置代理

在这里插入图片描述

3.1 相关环境变量

  • http_proxy: HTTP 协议代理地址和端口号。

  • https_proxy: HTTPS 协议代理地址和端口号。

  • ftp_proxy: FTP 协议代理地址和端口号。

  • socks_proxy: SOCKS 协议代理地址和端口号。

  • all_proxy: 所有协议的代理地址和端口号。

    • 注意:在使用 all_proxy 变量时可能会和其他的变量冲突,应该把 http_proxyhttps_proxyftp_proxy 变量置空或删除。

3.2 设置代理

export PROXY="http://127.0.0.1:7890"
export http_proxy="$PROXY"
export https_proxy="$PROXY"
export ftp_proxy="$PROXY"
export socks_proxy="$PROXY"

3.3 取消代理设置

`export -n http_proxy https_proxy ftp_proxy socks_proxy all_proxy`

3.4 在系统级别上设置代理

/etc/environment 文件中添加相应的环境变量定义:

http_proxy="http://127.0.0.1:7890"
https_proxy="http://127.0.0.1:7890"
ftp_proxy="http://127.0.0.1:7890"
socks_proxy="http://127.0.0.1:7890"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux的Shell变量、环境变量、代理设置 的相关文章

  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • linux下写入后崩溃

    如果我使用 write 将一些数据写入磁盘上的文件会发生什么 但我的应用程序在刷新之前崩溃了 如果没有系统故障 是否可以保证我的数据最终会刷新到磁盘 如果您正在使用write 并不是fwrite or std ostream write 那
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • Grep 递归和计数

    需要在具有大量子目录的目录中搜索文件内的字符串 我在用着 grep c r string here 我怎样才能找到总数量 如何仅输出至少具有一个实例的文件 使用 Bash 的进程替换 这给出了我认为是您想要的输出 如果不是 请澄清问题 gr
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出

随机推荐

  • AI人体抠像之灰度图如何还原成原图——以Face++人体抠像为例

    Face 人体抠像API V1版本图片返回结果为灰度图 但是并不是可以直接用的结果 我们需要的是保留人体部分的像素数据 背景根据需要可以自由替换的 让我们来看看如何才能还原 原理 一 V1版本返回值可还原成灰度图 颜色只有黑白灰三种颜色 颜
  • 鸿蒙系统开源

    华为的鸿蒙系统可能一直是听说过没见过的系统 在今天也终于正式宣布开源了 鸿蒙系统托管在了国内的 Gitee 上 也就是码云上面 其地址如下 https openharmony gitee com 在它的托管主页上有一个项目介绍 我这里复制过
  • 华为笔试题:坐标移动

    include
  • Spring集成Hadoop实践

    在Spring中集成Hadoop流程梳理 1 maven添加spring data hadoop依赖
  • 关于mysql一直显示Processing configuration..

    安装3遍一直显示Processing configuration 最后重启解决的 有相同问题的可以试试
  • matter.js的入门小结

    Matter js 是一个用于创建物理引擎的 JavaScript 库 它提供了一个简单而强大的 API 使得开发者可以创建出真实世界中的物理效果 例如碰撞 重力和摩擦等 以下是 Matter js 入门学习笔记 1 安装和导入 Matte
  • html视频倍速播放,如何让网页视频倍速播放

    Video Speed Controller 是一款倍速播放视频的浏览器插件 现在网站上播放的视频 基本上都可以实现倍速播放 但偶尔也有些网站上的视频 没有倍速播放功能 有时候看一些没有倍速播放功能的视频 确实比较难受或有点不耐烦 有没有一
  • Android 进阶解密:根 Activity 启动过程

    一 根 Activity 启动过程 可以分为三个部分 Launcher 请求 AMS 过程 AMS 到 ApplicationThread 的调用过程 ActivityThread 启动 Activity 二 Launcher 启动 AMS
  • zynq emio 外接emmc/SD 相关问题与描述总结

    在使用emio的情况要注意 由于通过PL的扩展 导致一些问题 如时钟时序 数据 cmd的方向控制都需要注意 A emio的clk和clk fb要短接 原因是要通过反馈修复clk输出时序 可通过内部直接短接 该处理方式有一定风险 反馈距离过短
  • centos7Nginx通过反向代理设置https配置多端口访问

    Https server配置 96 HTTPS server 97 98 server 99 listen 80 100 listen 443 ssl 101 server name www lidengxxxx top 102 103 s
  • c++仿函数 functor

    内容整理自国外C 教材 先考虑一个简单的例子 假设有一个vector
  • 使用IntelliJ IDEA2018创建并发布一个简单JavaWeb项目

    使用IntelliJ IDEA2018创建并发布一个JavaWeb项目 新建Web项目 Fill New Project 进入创建项目窗口 Java Enterprise 勾选Web Application next 设置项目名及项目路径
  • glsl vscode写_学会用好 Visual Studio Code

    Visual Studio Code是个牛逼的编辑器 启动非常快 完全可以用来代替其他文本文件编辑工具 又可以用来做开发 支持各种语言 相比其他IDE 轻量级完全可配置还集成Git感觉非常的适合前端开发 是微软亲生的想必TypeScript
  • 13个超强的 SpringBoot 实战项目 (还不赶紧收藏起来)

    在GItHub和Gitee上找了一些超好的Spring boot项目 如果大家觉得不错 可以顺手给这些项目点个小星星 一 云收藏 云收藏是一个使用 Spring Boot 构建的开源网站 可以让用户在线随时随地收藏的一个网站 在网站上分类整
  • java使用WebSocket实现一对一实时对话

    最近的项目中有实时对话的需求 这里也是查阅了很多的资料 使用webSocket实现一对一对话是最多的 链接 https pan baidu com s 1Vn1e1qw7nRnU1 4R 4fcGg 提取码 qwer 逻辑讲解 现在我们要给
  • Linux下protobuf的简单使用

    1 创建proto文件 touch test proto 2 往proto文件添加内容 syntax proto3 message Person string name 1 int32 age 18 第一行表示使用proto3语法进行编译
  • 【CUDA入门笔记】CUDA内核与线程配置

    1 CUDA核函数 在GPU上调用的函数成为CUDA核函数 Kernel function 核函数会被GPU上的多个线程执行 每个线程都会执行核函数里的代码 当然由于线程编号的不同 执行的代码路径可能会有所不同 1 函数的最前面是声明标识符
  • Qt进程和线程之一:运行一个进程和进程间通信

    Qt提供了一个与平台无关的QProcess类 用以对进程的支持 本节讲述了怎样在Qt应用程序中启动一个外部程序进程 以及几种常用的进程间通信方法 设计应用程序时 有时不希望将一个不太相关的功能集成到程序中 或者是因为该功能与当前设计的应用程
  • pinia简介和setup语法糖

    pinia简介和setup语法糖 1 pinia的基本特点 pinia同样是一个Vue 状态管理工具 它和vuex有很多相似的地方 本质上他是vuex团队核心成员开发的 在vuex上面提出了一些改进 与vuex相比 pinia去除了vuex
  • Linux的Shell变量、环境变量、代理设置

    Linux的Shell变量 环境变量 代理设置 引言 一 shell与shell变量 环境变量 1 1 概念 1 2 作用域 1 3 SSH 连接 Linux 服务器的环境变量处理流程 1 4 环境变量文件 二 变量增删改查 2 1 查看变