- 1.輸出重定向
- 2.多命令批量執行(; 、&&、 ||)
- 3.腳本不同方式執行的區別(source、bash、sh、./)
- 4.理解環境變量
- 5.export
- 6.引號的使用
- last.命令相關
1.輸出重定向
3種數據流:
stdin:標準輸入,代碼0,重定向符號
<
、<<
。
stdout:標準輸出,代碼1,重定向符號>
、>>
。
stderr:標準錯誤輸出,代碼2,重定向符號2>
、2>>
。
>
、2>
覆蓋寫入
>>
、2>>
追加寫入
創建一個py腳本分別輸出標準輸出和錯誤輸出:
map@gzdt-map-poi-yingxiang-offline04 test$ cat logging_demo.py
print(1)
print(1 / 0)
標準輸出&錯誤輸出分別重定向到兩個不同文件:
python logging_demo.py >a.file 2>b.file
,或者
python logging_demo.py 1>a.file 2>b.file
,1可以省略。
標準輸出&錯誤輸出重定向到同一個文件:
python logging_demo.py >c.file 2>&1
,或者
python logging_demo.py &> c.file
。
Q1:怎么理解2>&1?
A1:將文件描述符 2(標準錯誤)重定向到文件描述符 1(標準輸出)。
Q2:為什么python logging_demo.py 2>&1 >c.file
不可以?
A2:先2>&1
會將標準錯誤輸出重定向到標準輸出(一般是終端),之后再重定向標準輸出到c.file,這只會改變標準輸出到c.file,標準錯誤輸出仍然輸出到原標準輸出(終端)。
2.多命令批量執行(; 、&&、 ||)
;
:前后命令不相關的連續執行。例如cat a ; touch b
,無論a文件存不存在前面一個命令能否正確執行,后一個命令都會執行,b文件被創建。
&&
:前后命令相關的連續執行,只有當前面命令能正確執行($?=0)時,后面的命令才會執行。例如cd dir && pwd
,dir存在才會打印dir的路徑。
||
:前后命令相關的連續執行,只有當前面命令不能正確執行($?≠0)時,后面命令才會執行。前面命令如果能正確執行則后面的命令不再執行。例如cd dir || mkdir dir
,如果dir存在,直接進入,不存在則創建。
3.腳本不同方式執行的區別(source、bash、sh、./)
bash、sh、以及相對路徑或絕對路徑的方式執行,相當于在當前進程中新開了一個子進程用來執行腳本,腳本執行完子進程銷毀,子進程中定義的變量&環境不會回傳給父進程。
source方式執行相當于在當前進程中執行腳本內容,腳本中的變量&環境操作會影響當前進程。
特別需要注意,管道操作并不會傳遞環境變量,管道中的每個子進程的環境變量都繼承自父進程,例如下面在set_env.sh
腳本中設置python環境變量并輸出。
map@gzdt-map-poi-yingxiang-offline04 coordinate$ sh ./set_env.sh
Python 2.7.2map@gzdt-map-poi-yingxiang-offline04 coordinate$ sh ./set_env.sh | python -V
Python 3.6.5
Python 2.7.2
從輸出結果也可以看到:管道操作并非后面的進程在前面的進程執行完后啟動,而是同時啟動,只有當前面進程的標準輸出是后面進程的標準輸入時,前面進程才會一定先于后面進程執行完。
1)bash與sh的區別:可以簡單理解為,bash在sh的基礎上,增加了更多的拓展特性,適合編寫更復雜的腳本,兼容sh。實際生產環境中很多sh仍然鏈接指向到bash。
2)./相對路徑的方式執行時,具體是bash執行還是sh執行,取決于腳本首行的shebang是#!/bin/bash
還是#!/bin/sh
。
4.理解環境變量
這塊剛接觸linux的時候可能會比較不容易理解,甚至會因為害怕影響別人的系統環境而不敢隨意修改…,現在想從進程的角度來理解環境變量。
linux中的環境變量可以分為3個層級:系統級、用戶級、會話級。系統級和用戶級的修改都需要通過修改相關配置文件實現,修改后如果不重啟需要source刷新生效。會話級的環境變量可通過export直接在shell中修改。
日常開發中經常會出現多用戶共用linux開發機、多人使用相同用戶賬號共用linux開發機的情況,每次通過iterm或SecureCRT這樣的終端軟件連接linux服務器時,都相當于新開了一個會話,其實也就是新起了一個shell進程,這個進程的初始環境變量來源于系統級的環境變量文件和用戶級的環境變量文件配置,因為進程間的資源隔離,所以無論是多用戶賬號登陸,還是單用戶賬號多人共享登陸,每個shell中的環境變量操作(除非修改用戶或系統環境變量配置文件)互不影響,屬于會話級別的操作,當斷開連接的時候會話結束進程銷毀,下次重新連接時新shell進程的環境變量又會根據配置文件初始化。
因此從進程資源的角度來說,只要不修改物理配置文件,是不會影響其它用戶的。
5.export
export也是一個環境變量相關的命令。linux中在當前shell中執行一個命令,大多時候都是新起一個子進程執行,這些子進程初始的環境變量繼承自當前shell父進程。如果不使用export,當前設置的環境變量只會在當前shell有效,不會繼承給子shell。
map@gzdt-map-poi-yingxiang-offline04 coordinate$ value=1
map@gzdt-map-poi-yingxiang-offline04 coordinate$ echo $value
1
map@gzdt-map-poi-yingxiang-offline04 coordinate$ bash
Package bash-completion was not found in the pkg-config search path.
Perhaps you should add the directory containing `bash-completion.pc'
to the PKG_CONFIG_PATH environment variable
No package 'bash-completion' found
bash: /yum: 沒有那個文件或目錄
manpath: 警告:已經設定了 $MANPATH,忽略 /etc/man_db.conf
manpath: 警告:已經設定了 $MANPATH,忽略 /etc/man_db.conf
map@gzdt-map-poi-yingxiang-offline04 coordinate$ echo $valuemap@gzdt-map-poi-yingxiang-offline04 coordinate$
map@gzdt-map-poi-yingxiang-offline04 coordinate$ export value=1
map@gzdt-map-poi-yingxiang-offline04 coordinate$ echo $value
1
map@gzdt-map-poi-yingxiang-offline04 coordinate$ bash
Package bash-completion was not found in the pkg-config search path.
Perhaps you should add the directory containing `bash-completion.pc'
to the PKG_CONFIG_PATH environment variable
No package 'bash-completion' found
bash: /yum: 沒有那個文件或目錄
manpath: 警告:已經設定了 $MANPATH,忽略 /etc/man_db.conf
manpath: 警告:已經設定了 $MANPATH,忽略 /etc/man_db.conf
map@gzdt-map-poi-yingxiang-offline04 coordinate$ echo $value
1
map@gzdt-map-poi-yingxiang-offline04 coordinate$
所以也為什么能理解,在修改物理配置文件中的環境變量時,為什么都是export xxx=xxx
,因為要讓登陸時的shell父進程中的環境變量可以被所有子進程繼承。
環境變量設置一般遵循
export PATH1=PATH2:PATH3:$PATH1
的格式,:
用來分隔目錄路徑,表示在原變量值$PATH1
的基礎上,新增加PATH2
和PATH3
。在使用時會從左往右查找,找到后就不再往后查找。
6.引號的使用
shell中的引號包括單引號''
、雙引號""
、反引號``
。
單引號:強引用,引號內的任何內容都會被當作字面量處理,不會進行變量替換或者命令替換。
雙引號:弱引用,引號內的變量可以被解釋替換。
反引號:用于命令替換,反引號內的內容被當作shell命令執行,并將命令的執行結果用來替換原內容。和$()
同樣的作用,shell中推薦使用$()
進行命令替換。
引號在嵌套使用時,遵循從左往右匹配原則,解釋方式也只跟最外層引號相關,不受內層引號類型影響。比如shell中拼接一段用雙引號包含路徑的sql字符串,sql=
'..."${path}"...'
錯誤,因為最外層單引號,所以內層都會被當字面量解釋。可以sql='..."'${path}'"...'
,后面這種方式相當于3部分拼接而成:..."
、${path}
、"...
last.命令相關
https://blog.csdn.net/atwdy/article/details/137874868