1. 程式人生 > >Linux:shell變數功能和Bash shell的操作環境

Linux:shell變數功能和Bash shell的操作環境

shell的變數功能

sh和bash命令

兩者都是shell,都是解析工具。

bash(Bourne Again SHell) 是Linux標準的預設shell ,它基於Bourne shell,吸收了C shell和Korn shell的一些特性。

sh(Bourne shell )是UNIX標準的預設shell,它簡潔(concise)、緊湊(compact)  、高效(fast) ,是由AT&T編寫,屬於系統管理shell。

bash完全相容Bourne shell,也就是說用Bourne shell的指令碼不加修改可以在bash中執行。

shell出現的問題

Tab鍵不能補全的問題

應該是在裝某個軟體的時候篡改了/etc/passwd檔案,或者在建立使用者的時候指定了shell為sh,導致tab鍵不能正常補全。

解決辦法

root使用者下修改/etc/passwd檔案(該檔案儲存的是作業系統使用者資訊)

正確的應該是如pika:x:1007:1007::/home/pika:/bin/bash

可能是後面沒有shell或者是/bin/sh導致的,修改或者加上去就可以了。

Note: 沒有指定為/bin/bash時使用ssh登入只顯示$且不會載入.bashrc檔案,而指定了就應該顯示[email protected]:~$ 。

變數的取用與設定:echo, 變數設定規則, unset

echo輸出重定向,echo命令向一個檔案寫入內容

覆蓋型寫法 (檔案裡原來的內容被覆蓋)
echo "aaa" > a.txt
echo aaa > a.txt
新增型寫法 (新內容新增在原來內容的後面)

echo "aaa" >> a.txt

Note: 如果echo "aaa" >> a.txt 1> /dev/null是不會追加到a.txt的,而echo "aaa" || tee -a a.txt 1> /dev/null可以

echo顯示多行字串

(echo "section: screens
        $(hostname):
        $client:
end
section: links
        $client:
                right = $(hostname)
        $(hostname):
                left = $client
end
")

注意括號不能去掉,如果括號去掉的話,那麼只能寫入最後一個! "也不能去掉!

sudo對echo等命令提升許可權

sudo echo a > 1.txt
-bash: 1.txt: Permission denied
bash 拒絕這麼做,說是許可權不夠.這是因為重定向符號 “>” 也是 bash 的命令。sudo 只是讓 echo 命令具有了 root 許可權,但是沒有讓 “>” 命令也具有root 許可權,所以 bash 會認為這個命令沒有寫入資訊的許可權。

解決:

echo a |sudo tee -a 1.txt  // -a是追加的意思,等同於 >>

將 sudo 的影響範圍擴充套件到整條命令:sudo sh -c "echo a > 1.txt"

echo輸出帶顏色的字型

echo要變換顏色的時候,要使用引數-e

格式: echo -e "\033[字背景顏色;字型顏色m字串\033[0m"

 背景色:0 透明(使用終端顏色), 40 黑, 41 紅, 42 綠, 43 黃, 44 藍 45 紫, 46 青綠,47白(灰)
 前景色: 30 黑 31 紅, 32綠, 33 黃, 34 藍, 35 紫, 36 青綠, 37 白(灰)
 高亮度:高亮是1,不高亮是0。注意m後面緊跟字串。

如: echo -e "\033[31;1m wget export client=pika \033[0m"

環境變數的功能

Shell script 的預設變數($0, $1...)

/path/to/scriptname  opt1  opt2  opt3  opt4       $0             $1    $2    $3    $4

執行的指令碼檔名為 $0 這個變數,這些較為特殊的變數可以在 script 內使用來呼叫這些引數喔!

  • $# :代表後接的引數“個數”,以上表為例這裡顯示為“ 4 ”;
  • [email protected] :代表“ "$1" "$2" "$3" "$4" ”之意,每個變數是獨立的(用雙引號括起來);
  • $* :代表“ "$1<u>c</u>$2<u>c</u>$3<u>c</u>$4" ”,其中 <u>c</u> 為分隔字元,預設為空白鍵, 所以本例中代表“ "$1 $2 $3 $4" ”之意。

那個 [email protected] 與 $* 基本上還是有所不同啦!不過,一般使用情況下可以直接記憶 [email protected] 即可。

用 env 觀察環境變數與常見環境變數說明

用 set 觀察所有變數 (含環境變數與自訂變數)

export: 自訂變數轉成環境變數

所謂的環境變數與自訂變數,那麼這兩者之間有啥差異呢?其實這兩者的差異在於“ 該變數是否會被子程式所繼續引用”啦!唔!那麼啥是父程式?子程式? 這就得要了解一下指令的下達行為了。

當你登陸 Linux 並取得一個 bash 之後,你的 bash 就是一個獨立的程式,這個程式的識別使用的是一個稱為程式識別碼,被稱為 PID 的就是。 接下來你在這個 bash 下面所下達的任何指令都是由這個 bash 所衍生出來的,那些被下達的指令就被稱為子程式了。 我們可以用下面的圖示來簡單的說明一下父程式與子程式的概念:

程式相關性示意圖

圖10.2.3、程式相關性示意圖

因為子程式僅會繼承父程式的環境變數, 子程式不會繼承父程式的自訂變數啦!所以你在原本 bash 的自訂變數在進入了子程式後就會消失不見, 一直到你離開子程式並回到原本的父程式後,這個變數才會又出現!

如果我能將自訂變數變成環境變數的話,那不就可以讓該變數值繼續存在於子程式了? 呵呵!沒錯!此時,那個 export 指令就很有用。

使用示例

export ECLIPSE_URL='https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R1/eclipse-inst-linux64.tar.gz&mirror_id=1109'

export a=string

影響顯示結果的語系變數 (locale)

變數的有效範圍

變數鍵盤讀取、陣列與宣告: read, array, declare

與檔案系統及程式的限制關係: ulimit

變數內容的刪除、取代與替換 (Optional)

:符合取代文字的“最短的”那一個;:符合取代文字的“最長的”那一個

配置$PATH

Linux下環境變數path的配置,Linux系統中把***目錄新增到PATH中。

1.#   PATH=$PATH:/etc/apache/bin
使用這種方法,只對當前會話有效,也就是說每當登出或登出系統以後(關閉terminal就會失效),PATH 設定就會失效
2.$sudo  vi /etc/profile
在適當位置新增 PATH=$PATH:/etc/apache/bin
這種方法最好,除非你手動強制修改PATH的值,否則將不會被改變

export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/
export HADOOP_HOME=/usr/local/hadoop-2.6.4
export SPARK_HOME=/opt/spark
export PYSPARK_PYTHON=python3
export PATH=$PATH:$JAVA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

在/etc/profile中修改path,重啟後path就成功設定了。如果用ssh localhost登入,不用重啟自動設定了。直接新開terminal不重啟則要source一下才生效。

Note:

1 包含需要用的其它變數時,PATH最好放最後,比如lz發現,ssh localhost登入時,如果亂序,PATH中有些值就是空的!

2 $後面的變數應該可加{}也可不加{}。

3 賦值時,應該可加""也可不加""。

4 配置export的內容必須是實際目錄,不能是ln -s軟連結的目錄。

5 = 即等號兩邊不能有任何空格

6 在修改了PATH值或任何環境變數後,都要用export將其輸出,新的PATH值才能生效。

3.#    vi ~/.bash_profile
修改PATH行,把/etc/apache/bin新增進去
這種方法是針對當前使用者起作用的,ssh localhost並沒有生效!

當然也可以修改/etc/environment代替/etc/profile的修改

pika:~$sudo vi /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
PATH="$PATH:${JAVA_HOME}/bin:${SPARK_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"
export PATH
export JAVA_HOME=/opt/jdk1.8.0_73
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/

皮blog

bash登入與歡迎資訊

bash 的進站與歡迎訊息

/etc/issue

蝦密! bash 也有進站畫面與歡迎訊息喔?真假?真的啊! 還記得在終端機介面 (tty1 ~ tty6) 登陸的時候,會有幾行提示的字串嗎?那就是進站畫面啊! 那個字串寫在哪裡啊?呵呵!在 /etc/issue 裡面啊!先來看看:
[[email protected] ~]$ cat /etc/issue
\S
Kernel \r on an \m
man issue 配合 man agetty 得到下面的結果:
issue 內的各程式碼意義
\d 本地端時間的日期;
\l 顯示第幾個終端機介面;
\m 顯示硬體的等級 (i386/i486/i586/i686...);
\n 顯示主機的網路名稱;
\O 顯示 domain name;
\r 作業系統的版本 (相當於 uname -r)
\t 顯示本地端時間的時間;
\S 作業系統的名稱;
\v 作業系統的版本。

/etc/issue.net

除了 /etc/issue 之外還有個 /etc/issue.net 呢!這是啥?這個是提供給 telnet 這個遠端登陸程式用的。 當我們使用 telnet 連線到主機時,主機的登陸畫面就會顯示 /etc/issue.net 而不是 /etc/issue 呢!

/etc/motd

至於如果您想要讓使用者登陸後取得一些訊息,例如您想要讓大家都知道的訊息, 那麼可以將訊息加入 /etc/motd 裡面去

皮blog

bash的環境配置檔案

個人配置檔案介紹

環境配置檔案: login, non-login shell, /etc/profile, ~/.bash_profile, source, ~/.bashrc, /etc/bash.bashrc

login和non-login

login 登入環境:指使用者登入系統後的工作環境
non-login 非登入環境:指使用者呼叫子shell時所使用的使用者環境
login shell” 代表使用者登入, 比如使用 “su -“ 命令, 或者用 ssh 連線到某一個伺服器上, 都會使用該使用者預設 shell 啟動 login shell 模式。該模式下的 shell 會去自動執行 /etc/profile 和 ~/.profile 檔案, 但不會執行任何的 bashrc 檔案, 所以一般再 /etc/profile 或者 ~/.profile 裡我們會手動去 source bashrc 檔案。

no-login shell 是我們在終端下直接輸入 bash 或者 bash -c “CMD” 來啟動的 shell。該模式下是不會自動去執行任何的 profile 檔案。

interactive shell 和 non-interactive shell

interactive shell 是互動式shell, 顧名思義就是用來和使用者互動的, 提供了命令提示符可以輸入命令.

該模式下會存在一個叫 PS1 的環境變數, 如果還不是 login shell 的則會去 source /etc/bash.bashrc 和 ~/.bashrc 檔案

non-interactive shell 則一般是通過 bash -c “CMD” 來執行的bash.

該模式下不會執行任何的 rc 檔案

這些檔案的的作用時機

    /etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.並從/etc/profile.d目錄的配置檔案中搜集shell的設定.此檔案預設呼叫/etc/bash.bashrc檔案。只有 Login 時,/etc/profile 檔案才會被呼叫

    /etc/bashrc:為每一個執行bash shell的使用者執行此檔案.當bashshell被開啟時,該檔案被讀取.

  ~/.profile    ~/.bash_profile ~/.bash_login:使用者登入執行,source立即生效。每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案.~/.bash_profile 是互動式、login 方式進入 bash 執行的~/.bashrc 是互動式 non-login 方式進入 bash 執行的通常二者設定大致相同,所以通常前者會呼叫後者。

  ~/.bashrc(~/.bash_profile for OS X):每次開啟新視窗時執行。該檔案包含專用於你的bashshell的bash資訊。與/etc/bashrc衝突則執行前者~。針對於使用者的配置,應該將配置資訊寫入~/.bashrc檔案。

   ~/.bash_logout:當每次退出系統(退出bashshell)時,執行該檔案。
Note: 程式設計中,如果你只是在terminal中執行程式碼,設定路徑如SPARK_HOME時,可以只設置在~/.bashrc中;但是如果要在其它IDE如pycharm中執行,就要將SPARK_HOME設定在~/.profile中!!!

Login shell的配置檔案讀取流程

profile

其實看名字就能瞭解大概了, profile 是某個使用者唯一的用來設定環境變數的地方, 因為使用者可以有多個 shell 比如 bash, sh, zsh 之類的, 但像環境變數這種其實只需要在統一的一個地方初始化就可以了, 而這就是 profile.

bashrc

bashrc 也是看名字就知道, 是專門用來給 bash 做初始化的比如用來初始化 bash 的設定, bash 的程式碼補全, bash 的別名, bash 的顏色. 以此類推也就還會有 shrc, zshrc 這樣的檔案存在了, 只是 bash 太常用了而已.


/etc/enviroment
/etc/profile 是所有使用者的環境變數; /etc/enviroment是系統的環境變數
       登陸系統時shell讀取的順序應該是
             /etc/profile ->/etc/enviroment -->$HOME/.profile   -->$HOME/.env
如果同一個變數在使用者環境(/etc/profile)和系統環境(/etc/environment)有不同的值那應該是以使用者環境為準了。
Note:
奇怪的是,lz在/etc/enviroment中設定PATH後,每次重新開啟terminal或者重啟後必須執行. /etc/enviroment設定才會生效,無論是直接在linux系統中還是在docker中,所以如果想要設定所有使用者的PATH變數,還是修改/etc/profile吧。
修改/etc/profile source以後重新開啟一個terminal並不會生效,要source一下;但是重啟後開啟terminal就會一直生效。
修改~/.bashrc source以後重新開啟一個terminal會生效,但是它切換使用者後設置就無效了。

工作環境設定檔案

環境設定檔案有兩種:系統環境設定檔案 和 個人環境設定檔案
1.系統中的使用者工作環境設定檔案:
 登入環境設定檔案:/etc/profile    
 非登入環境設定檔案:/etc/bashrc

2.使用者個人設定的環境設定檔案:
 登入環境設定檔案: $HOME/.bash_profile   //這個是環境變數設定的地方
 非登入環境設定檔案:$HOME/.bashrc       //這個是定義別名的地方
Note:
1 ~/.bash_profile 都是在取得 login shell 的時候才會讀取的配置檔案,所以, 如果你將自己的偏好設定寫入上述的檔案後,通常都是得登出再登入後,該設定才會生效。
2 直接讀取配置檔案而不登出登入:source 命令

[[email protected] ~]# source ~/.bashrc 

[[email protected] ~]# . ~/.bashrc

利用 source 或小數點 (.) 都可以將配置檔案的內容讀取到目前的shell 環境中! 如我修改了 ~/.bashrc ,那麼不需要登出,立即以 source ~/.bashrc 就可以將剛剛最新謳定的內容讀取到目前環境中。

這個方法的原理就是再執行一次/etc/profile shell指令碼,注意如果用sh /etc/profile是不行的,因為sh是在子shell程序中執行的,即使PATH改變了也不會反應到當前環境中,但是source是在當前 shell程序中執行的,所以我們能看到PATH的改變。

皮blog

相關推薦

Linuxshell變數功能Bash shell操作環境

shell的變數功能 sh和bash命令 兩者都是shell,都是解析工具。 bash(Bourne Again SHell) 是Linux標準的預設shell ,它基於Bourne shell,吸收了C shell和Korn shell的一些特性。 sh(Bou

01 Shell概述 編寫及執行指令碼 、 Shell變數 總結答疑

Top NSD SHELL DAY01 案例1:Shell基礎應用 案例2:簡單Shell指令碼的設計 案例3:使用Shell變數 案例4:變數的擴充套件應用 1 案例1:Shell基礎應用 1.1 問題 本案例要求熟悉Linux Shell環境

Linux-SHELL中shbash的區別

什麼是SHELL? shell的中文意思就是貝殼,其實比較類似於我們核心的殼。我們通過hsell和使用者通訊SHELL簡而言之就是隻要能夠操作應用程式的介面都能夠稱為SHELL。狹義的shell指的是命令列方面的軟體,廣義的SHELL則包括圖形介面。 S

linux 把cd 命令寫在bash shell腳本里不起作用

寫shell指令碼時,發現把cd命令寫在裡面無法正確跳轉,還是在當前目錄下,其實檔案已經跳轉,不過subshell退出的時候又回到當前目錄了,解決方法: source yourshellname 其中,yourshellname就是你的shell指令碼的檔名

C++ extern關鍵字功能用法研究

今天遇到在aaa.cpp檔案中定義如下函式:                                   &nbs

Linux select()詳解 實現原理【轉】

https://www.cnblogs.com/sky-heaven/p/7205491.html#4119169   轉自:http://blog.csdn.net/huntinux/article/details/39289317 原文:http://blog.csdn.n

Linux之vim編輯器bash算術運算入門

Linux的命令列介面下面有非常多的文字編輯器。比如經常聽說的就有Emacs、pico、nano、joe與vim等。vim可以看做是vi的高階版。我們為什麼一定要學習vim呢?有以下幾個原因: (1)所有的Unix like系統都會內建vi文字編輯器,其他的文字編輯器則不一定會存在。 (2)

awk字串操作(字串連結、傳入傳出shell變數) awk 字串連線操作(字串轉數字,數字轉字串) awk當中使用外部變數 awk中使用shell環境變數 awk如何向shell傳值

1.awk基礎 awk的環境變數及其意義   https://blog.csdn.net/snowpay/article/details/52451718 linux awk命令詳解 https://www.cnblogs.com/xudong-bupt/p/3721210.html 2.aw

Android開發系列(二十二)AdapterViewFlipper的功能用法

AdapterViewFlipper繼承了AdapterViewAnimator,它會顯示一個View元件,可以通過showPrevious()和showNext()方法控制組件顯示上一個、下一個元件。 XML屬性: android:animateFirstView:設定

tensorflow學習筆記(五)TensorFlow變數共享資料讀取

  這一節我們提及了三個內容:變數共享、執行緒和佇列和資料讀取,這些都是TensorFlow官方指導中的內容。會在程式中經常遇到所以放在一起進行敘述。前面都是再利用已有的資料進行tensorflow的學習,這一節我們要學習怎麼從檔案中讀取我們需要的各類資料。

Laravel學習檢視變數傳遞Blade

檢視變數的傳遞 1、使用with 2、陣列直接傳值 3、compact繫結傳值 這裡簡單的說一下使用@yield 建立一個app.blade.php <!DOCTYPE html> <html> <head> <titl

Linux測試socket傳送接收時,緩衝區buf的大小

可通過以下程式測試socket傳送和接收時,緩衝區buf的大小: server端: struct ps{     int st;     pthread_t *thr; }; #define MAXBUF 131072 pthread_mutex_t mutex =

linux關於關閉防火墻selinux的操作

防火墻 selinux 在初學linux的時候,有防火墻和selinux時,我們對於一些操作不是很方便;比如DNS的遠程訪問和httpd程序的操作;所以我們需要一些操作來關閉防火墻和selinux;SElinux配置: ~]# getenforce Enforcing ~]# set

linux給命令取別名為某些操作設定快捷鍵

如果要給某個比較長的,或者比較複雜的命令設定一個比較簡單的命令可以給他取別名; 可以這樣寫:alias a=' cd /cat' 以後你打a就相當於打了cd /cat'但這隻針對當前回話要想永久記住就要寫進 $HOME/.bashrc或$HOME/.bash_profile

linux中安裝protobuf編譯器運行時環境

version eas 如果 -a java shared 能夠 顯示 fig 為了使用源碼編譯protobuf,需要下面的工具: autoconf, automake, libtool, make, g++, unzip 如果你使用ubuntu/debian,你可以使

Linux Bash Shell學習(十五變數型別整型運算

                  本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之讀書筆記之二,但我們將不限於此。  在之前,我們涉及的變數基本上是字串,也有整數,例如便是引數個數的$

linux bash Shell特殊變數Shell $0, $#, $*, [email protected], $?

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: [[email protected] /]$ ec

Linux學習筆記23——認識 BASH 這個 ShellShell變數功能

在 Linux 的環境下,如果你不懂 bash 是什麼,那麼其他的東西就不用學了!因為前面幾章我們使用終端機下達指令的方式, 就是通過 bash 的環境來處理的喔!所以說,他很重要吧!bash 的東西非常的多,包括變數的設定與使用、 bash 操作環境的建立、資料流重導向的功能,還有那好用的管線命令

Shelllinux bash Shell特殊變數Shell $0, $#, $*, [email protected]<

在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。  例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949

Part2 Linux Bash Shell變數重定向

直譯器 理解其他命令,並且命令執行起來 理解語句,並且根據流程控制機制讓語句按需執行: 編譯器 理解源程式,並且能夠將源程式轉換為二進位制格式,而後讓其夠執行 程式檔案:原始碼 直譯器: 由直譯器負責讀取一句執行一句 編譯器: 事先,將整個程式轉換成二進位制格式,而後執