《Linux從練氣到飛升》No.15 Linux 環境變量

🕺作者: 主頁

我的專欄
C語言從0到1
探秘C++
數據結構從0到1
探秘Linux
菜鳥刷題集

😘歡迎關注:👍點贊🙌收藏??留言

🏇碼字不易,你的👍點贊🙌收藏??關注對我真的很重要,有問題可在評論區提出,感謝閱讀!!!

文章目錄

    • 前言
    • 基本概念
    • 常見環境變量
    • 查看環境變量方法
    • 測試PATH
    • 測試HOME
    • 和環境變量相關的命令
    • 環境變量的組織方式
    • 如何通過代碼獲取環境變量?
    • 后記

前言

在我們使用Linux命令時,我們會發現。我們執行命令并不需要帶上路徑,但是為什么我們自己寫的C語言程序,需要帶上路徑。我們怎么把我們的程序可以做得像Linux的命令一樣,直接輸入就可以執行呢?本篇將回答這些問題,并講述相關的概念。

基本概念

  • 環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們的所鏈接的動態靜態庫在哪里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找。

  • 環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性

常見環境變量

  • PATH : 指定命令的搜索路徑
  • HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統中時,默認的目錄)
  • SHELL : 當前Shell,它的值通常是/bin/bash。

查看環境變量方法

echo $NAME //NAME:你的環境變量名稱

測試PATH

測試代碼:

#include <stdio.h>    int main(int argc, char *argv[],char *env[]) {   printf("hello world!\n");   return 0;   
}   

對比一下./hello執行和直接hello執行

在這里插入圖片描述
為什么有些指令可以直接執行,不需要帶路徑,而我們的二進制程序需要帶路徑才能執行?

比如說:ls

在這里插入圖片描述

因為他一定在這些目錄下面:

在這里插入圖片描述
這些指令比如說ls pwd等都可以直接運行因為,它會直接在環境變量下搜索該命令的路徑,然后執行程序。而我們自己寫的程序并不在 PATH中,就不能不帶路徑直接執行。

我們可以怎樣讓我們的程序像Linux的指令一樣呢?

  1. 把我們的程序放到PATH的路徑下,但是我們并不推薦這種做法,因為它會污染別人的命令池。我們這種做法相當于安裝。
  2. 將我們的程序的路徑放到環境變量里
export PATH=$PATH:[hello的路徑]

在這里插入圖片描述
這樣我們就可以直接運行程序,而不用帶上路徑了。

測試HOME

  • root普通用戶,分別執行echo $HOME對比差異
    在這里插入圖片描述

  • 執行 cd ~ pwd ,對應 ~ HOME 的關系
    在這里插入圖片描述

和環境變量相關的命令

  1. echo: 顯示某個環境變量值
    在這里插入圖片描述

  2. export: 設置一個新的環境變量

export PATH=$PATH:[hello的路徑]

在這里插入圖片描述
3. env: 顯示所有環境變量
在這里插入圖片描述

  1. unset: 清除環境變量
  2. set: 顯示本地定義的shell變量和環境變量
    在這里插入圖片描述

環境變量的組織方式

在這里插入圖片描述
每個程序都會收到一張環境表,環境表是一個字符指針數組,每個指針指向一個以’\0’結尾的環境字符串

如何通過代碼獲取環境變量?

  • 命令行第三個參數
    在我們上面的hello.c程序中,我們會發現main函數有三個參數與我們之前所見括號內無參有一些區別。但事實上他們是一樣的。我們接下來依次講述三個參數的作用。
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

首先我們看一下env的作用。

看一下運行結果:
在這里插入圖片描述
我們發現它就是我們之前在命令行輸入env命令時所展示的環境變量。

那么我們現在就知道它的作用了,每一個進程啟動的時候,啟動該進程傳遞給它的環境變量信息都由這個參數傳導進來。

誰導入的環境變量?
答案是通過從父進程那里繼承下來的。默認情況下,所有的環境變量都會被子進程繼承,環境變量具有全局屬性,但是所有的父進程都有它的父進程,最終的父進程就是bash。bash的環境變量從哪來呢?操作系統?

#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}

直接查看,發現沒有結果,說明該環境變量根本不存在

  • 導出環境變量 export MYENV="hello world"
  • 再次運行程序,發現結果有了!說明:環境變量是可以被子進程繼承下去的!

**還有什么獲取環境變量的方式嗎?**有的(environ、getenv函數等)
通過第三方變量environ獲取

#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

libc中定義的全局變量environ指向環境變量表,environ沒有包含在任何頭文件中,所以在使用時 要用extern聲明。

我們再來看第1和第2個參數。

測試代碼如下:

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(int i=0; i<argc; i++){printf("argv[%d]:%s\n",i,argv);}return 0;
}

測試結果:
在這里插入圖片描述

argv[0]:"./hello"
argv[1]:"-ls"
argv[2]:"-a"
argv[3]:"-b"

我們會發現argv存儲啟動程序的選項。

命令行參數最大的意義是讓我們同樣一個程序通過選項的方式可以使用同一個程序的不同的子功能,這就是選項的意義,即這些所有的命令后面所帶,選項底層都是用命令行參數完成的。

后記

本篇我們主要講述了什么是環境變量以及怎么設置環境變量?還有查看環境變量的方法。與環境變量相關的命令,環境變量的組織方式。最后還講述了如何通過代碼來獲取環境變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43002.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序通用字體代碼

下面是一個簡單的微信小程序通用字體代碼示例&#xff1a; // 在app.wxss中設置全局字體樣式 import ./styles/fonts.wxss;// 在fonts.wxss中定義字體樣式 font-face {font-family: CustomFont;src: url(font.ttf) format(truetype); }// 在page.wxss中使用自定義字體樣式 .cus…

SASS 學習筆記 II

SASS 學習筆記 II 上篇筆記&#xff0c;SASS 學習筆記 中包含&#xff1a; 配置 變量 嵌套 這里加一個擴展&#xff0c;嵌套中有一個 & 的用法&#xff0c;使用 & 可以指代當前 block 中的 selector&#xff0c;后面可以追加其他的選擇器。如當前的 scope 是 form&a…

GuLi商城-前端基礎Vue-使用Vue腳手架進行模塊化開發

自己親自實踐&#xff1a; mac安裝webpack webpack 簡介Webpack 是一個非常流行的前端構建工具&#xff0c;它可以將多個模塊&#xff08;包括CSS、JavaScript、圖片等&#xff09;打包成一個或多個靜態資源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生產…

19c_ogg搭建

1.環境介紹 源端&#xff1a;192.168.56.101 目標端&#xff1a;192.168.56.100 背景&#xff1a;數據從主庫cdb主機定位&#xff0c;同步到從庫 2.配置ogg 2.1 開啟歸檔、強制日志、補充日志 --ogg 主備都需要配置 SQL> alter database archivelog; SQL> alter databa…

【Axure高保真原型】JS日期選擇器篩選中繼器表格

今天和大家分享JS日期選擇器篩選中繼器表格的原型模板&#xff0c;通過調用瀏覽器的日期選擇器&#xff0c;所以可以獲取真實的日歷效果&#xff0c;具體包括哪一年二月份有29天&#xff0c;幾號對應星期幾&#xff0c;都是真實的&#xff0c;獲取日期值后&#xff0c;通過交互…

接口測試,負載測試,并發測試,壓力測試區別

接口測試 1.定義&#xff1a;接口測試是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換&#xff0c;傳遞和控制管理過程&#xff0c;以及系統間的相互邏輯依賴關系等。 2.目的&#xf…

原型與繼承

原型與繼承 在 JavaScript 中&#xff0c;對象有一個特殊的隱藏屬性 [[Prototype]]&#xff08;如規范中所命名的&#xff09;&#xff0c;它要么為 null&#xff0c;要么就是對另一個對象的引用。該對象被稱為“原型。 當我們從 object 中讀取一個缺失的屬性時&#xff0c;Jav…

使用Julia實現A*路徑尋找算法:一個深入的指南

第一部分&#xff1a;簡介與背景 1. 引言 Julia&#xff0c;作為一種高效、靈活且易于學習的編程語言&#xff0c;逐漸在科學計算、數據分析和機器學習等領域中占據一席之地。當我們談到路徑規劃或游戲開發時&#xff0c;A_算法&#xff08;A Star Algorithm&#xff09;常常…

什么是變量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天進步一點點 ? 專欄簡介? 變量提升&#xff08;Hoisting&#xff09;? 變量提升的示例&#xff1a;? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

7.3 C/C++ 實現順序棧

順序棧是一種基于數組實現的棧結構&#xff0c;它的數據元素存儲在一段連續的內存空間中。在順序棧中&#xff0c;棧頂元素的下標是固定的&#xff0c;而棧底元素的下標則隨著入棧和出棧操作的進行而變化。通常&#xff0c;我們把棧底位置設置在數組空間的起始處&#xff0c;這…

C++11并發與多線程筆記(9) async、future、packaged_task、promise

C11并發與多線程筆記&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future創建后臺任務并返回值2、std::packaged_task&#xff1a;打包任務&#xff0c;把任務包裝起來3、std::promise3、小結 1、std::async、std::future創建后臺任務…

C++友元函數和友元類

友元 1.友元介紹2.類友元2.1示例代碼 3.函數友元3.1示例代碼 4.總結 1.友元介紹 在C中&#xff0c;友元&#xff08;friend&#xff09;是一種機制&#xff0c;允許某個類或函數訪問其他類的私有成員。通過友元&#xff0c;可以授予其他類或函數對該類的私有成員的訪問權限。友…

哈工大開源“活字”對話大模型

一、介紹 大規模語言模型&#xff08;LLM&#xff09;在自然語言處理的通用領域已取得了令人矚目的成功。對于廣泛的應用場景&#xff0c;這種技術展示了強大的潛力&#xff0c;學術界和工業界的興趣也持續升溫。哈工大自然語言處理研究所30余位老師和學生參與開發了通用對話大…

re學習(35)攻防世界-no-strings-attached(動調)

參考文章&#xff1a;re學習筆記&#xff08;28&#xff09;攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客 攻防世界逆向入門題之no-strings-attached_攻防世界 no-strings-attached_沐一 林的博客-CSDN博客 本人題解&#xff1a; 扔入Exepeinfo中查殼和其他信息…

LVS-DR模型實例

一、LVS-DR集群介紹 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生產環境中最常用的一 種工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作為群集的訪問入口&#xff0c;不作為網關使用&#xff0…

python+django+mysql項目實踐五(信息搜索)

python項目實踐 環境說明: Pycharm 開發環境 Django 前端 MySQL 數據庫 Navicat 數據庫管理 信息搜素 輸入內容進行搜索,內容有文本類和時間類 文本類需要模糊搜索,包含即檢索 時間類需要選取時間范圍內的內容 views 利用Q完成對指定內容的檢索 檢索后按檢索內容更新…

HarmonyOS/OpenHarmony應用開發-ArkTS語言渲染控制ForEach循環渲染

ForEach基于數組類型數據執行循環渲染。說明&#xff0c;從API version 9開始&#xff0c;該接口支持在ArkTS卡片中使用。 一、接口描述 ForEach(arr: any[], itemGenerator: (item: any, index?: number) > void,keyGenerator?: (item: any, index?: number) > stri…

網絡綜合布線實訓室建設方案

一、網絡綜合布線系統概述 網絡綜合布線系統是為了滿足數據通信需求而設計和建立的一套基礎設施。它提供了數據傳輸、信號傳輸和電力供應的基礎結構&#xff0c;支持各種網絡設備和終端設備之間的連接。 網絡綜合布線系統通常包括以下組成部分&#xff1a; 1&#xff09; 數據…

面試題 17.10 主要元素

??題目來源&#xff1a; leetcode題目&#xff0c;網址&#xff1a;面試題 17.10. 主要元素 - 力扣&#xff08;LeetCode&#xff09; 解題思路&#xff1a; 首先&#xff0c;順序遍歷數組&#xff0c;將不同的數字消去&#xff0c;最后留下的數字若計數小于等于 0&#xff…

ZooKeeper集群服務器啟動

在本文中&#xff0c;我們將對集群版ZooKeeper服務器的啟動過程做詳細講解。集群和單機ZooKeeper服務器的啟動過程在很多地方都是一致的&#xff0c;因此本節只會對有差異的地方展開進行講解。下圖所示是集群版ZooKeeper服務器的啟動流程圖。 預啟動 預啟動的步驟如下。 (1)統…