鍍金池/ 教程/ Linux/ shell 學習三十九天---內(nèi)建命令
shell 學習四十五天---xargs
shell學習第三天
shell 學習十五天---join 連接字段
shell 學習第二天
shell 學習四十三天---臨時性文件的建立與使用
shell 學習第六天---小結(jié)
shell 學習三十三天---關(guān)于重定向
shell 學習二十九天---循環(huán)
shell 學習二十四天---提取開頭或結(jié)尾數(shù)行
shell 學習第十天---sed 查找與替換
shell 學習第十一天---sed 正則的精確控制
shell 學習三十天---break,continue,shift,getopts
shell 學習---小結(jié)
shell 學習三十一天---函數(shù)問題
shell 學習第四天---華麗的 printf 輸出
shell 學習三十五天---波浪號展開與通配符
shell 學習十九天---文本塊排序
shell 學習十二天---行與字符串
shell 學習二十一天---重新格式化段落
shell 學習十八天---文本排序
shell 學習十三天---sed 案例分析
shell 學習四十一天---列出文件 ls 和 od 命令
shell 學習十七天---awk 命令
shell 學習三十六天---命令替換
shell 學習十六天---join 練習
shell 學習三十二天---read 讀取一行
shell 學習二十二天---計算行數(shù),字數(shù)以及字符數(shù)
shell 學習小總結(jié)---本章小結(jié)
shell 學習第八天---擴展正則表達式(ERE)
shell 學習四十二天---使用 touch 更新文件時間
shell 學習二十八天---case 語句
shell 學習三十九天---內(nèi)建命令
shell 學習第一天
shell 學習三十四天---printf 詳解
shell 學習二十六天---變量與算數(shù)
shell 學習三十八天---執(zhí)行順序和 eval
shell 學習四十四天---尋找文件
shell 學習二十五天---神器的管道符
shell 學習十四天---使用 cut 選定字段
shell 學習第五天---基本的I/O重定向
shell 學習四十天---awk 的驚人表現(xiàn)
shell 學習二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學習二十三天---打印
shell 學習第九天---分組
shell 學習四十八天---文件校驗和匹配
shell 學習二十七天---退出狀態(tài)和 if 語句
shell 學習四十七天---文件比較 cmp,diff,patch
shell 學習第七天---基礎(chǔ)正則表達式(BRE)
shell 學習四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學習三十七天---引用
shell 學習小結(jié)

shell 學習三十九天---內(nèi)建命令

shell 識別三種基本命令:內(nèi)建命令,shell 函數(shù)以及外部命令:

  1. 內(nèi)建命令就是有 shell 本身所執(zhí)行的命令.
    有些命令是由于其必要性才內(nèi)建的,例如 cd 用來改變目錄,read 會將來自用戶(和文件)的輸入數(shù)據(jù)傳給 shell 外殼.
    另一種內(nèi)奸命令的存在則是為了效率,其中最典型的就是 test 命令,編寫腳本時經(jīng)常會用到它.另外還有 I/O 命令,例如 echo 與 printf.
  2. shell 函數(shù)是功能健全的一系列程序代碼,以 shell 語言寫成,他們可以像命令那樣引用.
  3. 外部命令就是由 shell 副本(新的進程)所執(zhí)行的命令,基本的過程如下:
    a.建立一個新的進程.此進程即為 shell 的一個副本
    b.在新的進程里,在 PATH 變量內(nèi)所列出的目錄中,需找特 定命令.
    /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/u sr/sbin:/usr/bin:/root/bin 為 PATH 變量典型的默認值
    當命令名稱含有斜杠(/)字符時,將略過路徑查找步驟
    c.在新的進程里,以所找到的新程序取代執(zhí)行中的 shell 程序并執(zhí)行
    d.程序完成后,最初的 shell 會接著從終端讀取下一條命令, 和執(zhí)行腳本里的嚇一跳命令.
    使用 type 可以查看是否是內(nèi)建命令
    type(不帶參數(shù))會顯示命令是內(nèi)建的還是外部的.
    -t : file 外部命令 ;alias 命令別名 ; builtin 內(nèi)置命令
    -a : 會將命令 PATH 路徑顯示出來.

如何執(zhí)行交互式命令:
用戶在輸入命令后,一般情況下 shell 會解釋并執(zhí)行該命令,但是 shell 的內(nèi)建命令例外,執(zhí)行內(nèi)建命令相當于調(diào)用 shell 進程的一個函數(shù),并不創(chuàng)建新的進程.

比如:cd,alias,umask,exit 等命令及時內(nèi)建命令,凡是用 which 命令查不到程序文件所在位置的命令都是內(nèi)建命令,內(nèi)建命令沒有單純的 man 手冊,要在 man 手冊中查看內(nèi)奸命令,應該 man bash-builtins,內(nèi)建命令雖然不創(chuàng)建新的進程,但也會有 Exit Static,通常也用 0 表示成功非零表示失敗,雖然內(nèi)建命令不創(chuàng)建新的進程,膽汁性結(jié)束后也有一個狀態(tài)嗎,也可以用特殊變量$?讀出.

command 命令

語法:
command [-p] program [arguments....]
用途:
在查找要執(zhí)行的命令時,為了避開 shell 的包含函數(shù).這允許從函數(shù)中訪問與內(nèi)建命令同名的內(nèi)建版本.
主要選項:
-p : 當查找命令是,使用$PATH 的默認值,保證找到系統(tǒng)的工具 行為:
command 會通過查閱特殊的與一般的內(nèi)建命令,已找出指定的 program,并沿著$PATH 查找.使用-p 選項,則會使用$PATH 的默認值,而非當前的設置.
如果 program 為特殊內(nèi)建命令,責任和的語法錯誤都不會退出 shell,且任何前置的變量指定在命令完成后,即不再有效.
案例:
命令:echo linux
輸出:linux
命令:command echo linux
輸出:linux
command 命令調(diào)用指定的指令并執(zhí)行,命令執(zhí)行時不查詢 shell 函數(shù)。command 命令只能夠執(zhí)行 shell 內(nèi)部的命令

POSIX 標準為特殊內(nèi)建命令提供了兩個附加特性:

  1. 特殊內(nèi)建工具語法上的錯誤,會導致 shell 執(zhí)行該工具時退出,然而當語法錯誤出現(xiàn)在一般內(nèi)建命令時,并不會導致 shell 執(zhí)行該工具時退出.如果特殊內(nèi)建工具遇到語法錯誤時不退出 shell,則它的退出值應該非零.
  2. 以特殊內(nèi)建命令所標明的變量指定,在內(nèi)建命令完成

第二項需要解釋一下,我們可以在命令前制定一個變量賦值,且變量值在被執(zhí)行命令的環(huán)境中不影響當前 shell 內(nèi)的變量或是接下來的命令:
PATH=/bin:/usr/bin:/usr/ucb awk ‘...’
然而,當這樣的指定用于特殊內(nèi)建命令時,及時在特殊內(nèi)建命令之后,仍然會有影響.

wait 命令是用來等待后臺程序完成的.如果未加任何參數(shù),wait 會等待所有的后臺工作完成;否則,每個參數(shù)可以是后臺工作的進程編號,或是工作控制的工作規(guī)格.
.(點號)也是很重要的命令.它是用來讀取與執(zhí)行包含在個別文件中的命令.例如:當你有很多歌 shell 函數(shù)想要在多個腳本中使用時,正確方式是將他們放在各自的庫文件里,再以點號命令讀取他們:
. my_funcs #在函數(shù)中讀取
如指定的文件未含斜杠,則 shell 會查找$PATH 下的目錄,以找到該文件.該文件無需是可執(zhí)行的,只要是可讀取的即可.

set 命令

set 命令最簡單的工作就是以排序的方式顯示所有的 shell 變量的名稱與值.這是調(diào)用它時不加任何參數(shù)與選項的行為.其輸出是采用 shell 稍后可以重讀的形式----包含適當?shù)囊?這個想法是出自 shell 腳本有可能需要存儲他的狀態(tài),在之后會通過.(點號)命令恢復它.

set 的另一項任務是改變位置參數(shù)($1,$2 等).使用--的第一個參數(shù)來結(jié)束設置它自己的選項,則所有接下來的參數(shù)都會取代位置參數(shù),及時他們是以正號或負號開頭.

set 的功能描述:設置 shell
語法:set [+-abCdefhHklmnpPtuvx]
補充說明:用 set 命令可以設置各種 shell 選項或者列 出 shell 量.單個選項設置常用的特性.在某些選項之后-o 參數(shù)將特殊特性打開.在某些選項之后使用+o 參數(shù)將關(guān)閉某些特性,不帶任何參數(shù)的 set 命 令將顯示 shell 的全部變量.除非遇到非法的選項,否則 set 總是返回 ture.

行為:

  1. 無選項或參數(shù),則以 shell 少后可讀取的形式來打印所有 shell 變量的名稱與值.
  2. 選項為--及參數(shù),則以提供的參數(shù)取代位置參數(shù)
  3. 開頭為-的短選項,或以-o 開頭的長選項,則可打開特定的 shell 選項,額外的非選項參數(shù)可設置位置參數(shù).
  4. 以+開頭的短選項,或以+o 開頭的長選項,則可關(guān)閉特定的shell 選項.
  5. 單一的-o 可以一種不特別指定的格式打印 shell 選項的當前設置.
  6. 單一的+o 則是顯示 shell 選項的當前設置,其采用 shell 之后可以重讀的方式,以獲得選項的相同設置.

最后,set 被用來打開或停用 shell 選項,指的是改變 shell 行為模式的內(nèi)部設置.

o形式 短選項 說明
allexport -a 從設置開始標記所有新的和修改過的用于輸出的變量
braceexpand -B 允許符號擴展,默認選項
emacs 在進行命令編輯的時候,使用內(nèi)建的 emacs 編輯器, 默認選項
errexit -e 如果一個命令返回一個非 0 退出狀態(tài)值(失敗),就退出.
histexpand -H 在做臨時替換的時候允許使用!和!! 默認選項
history 允許命令行歷史,默認選項
ignoreeof 禁止 coontrol-D 的方式退出 shell,必須輸入 exit。
interactive-comments 在交互式模式下, #用來表示注解
keyword -k 為命令把關(guān)鍵字參數(shù)放在環(huán)境中
monitor -m 允許作業(yè)控制
noclobber -C 保護文件在使用重新動向的時候不被覆蓋
noexec -n 在腳本狀態(tài)下讀取命令但是不執(zhí)行,主要為了檢查語法結(jié)構(gòu)。
noglob -d 禁止路徑名擴展,即關(guān)閉通配符
notify -b 在后臺作業(yè)以后通知客戶
nounset -u 在擴展一個沒有的設置的變量的時候, 顯示錯誤的信息
onecmd -t 在讀取并執(zhí)行一個新的命令后退出
physical -P 如果被設置,則在使用 pwd 和 cd 命令時不使用符號連接的路徑 而是物理路徑
posix 改變 shell 行為以便符合 POSIX 要求
privileged 一旦被設置,shell 不再讀取.profile 文件和 env 文件 shell 函數(shù)也不繼承任何環(huán)境
verbose -v 為調(diào)試打開 verbose 模式
vi 在命令行編輯的時候使用內(nèi)置的vi編輯器
xtrace -x 打開調(diào)試回響模式

擴展:
set,env 和 export 這三個命令都可以用來顯示 shell 變量,區(qū)別是:
set 用來顯示本地變量
env 用來顯示環(huán)境變量
export 用來顯示和設置環(huán)境變量

set 顯示當前 shell 的變量,包括當前用戶的變量
env 顯示當前用戶的變量
export 顯示當前到處成用戶變量的 shell 變量

每個 shell 有自己特有的變量(set)顯式的變量,這個和用戶變量不同,當前用戶變量和你用什么 shell 無關(guān),不管你用什么 shell 都在,比如 HOME,SHELL 這些變量,但 shell 自己的變量在不同的 shell 是不同的,比如 BASH_ARGC,BASH 等,這些變量只有 set 才會顯示,是 bash 特有的,export 不加參數(shù)的時候,顯示哪些變量被到處成了用戶變量,因為一個 shell 自己 Ian 量可以通過 export 導出變成一個用戶變量.

[root@linux ~]# aaa=bbb  
[root@linux ~]# echo $aaa  
bbb  
[root@linux ~]# set|grep aaa  
aaa=bbb  
[root@linux ~]# env|grep aaa  
[root@linux ~]# export aaa  
[root@linux ~]# env|grep aaa  
aaa=bbb  

set,env,export----linux 中的環(huán)境變量命令
linux 是一個多用戶的操作系統(tǒng).每個用戶登錄系統(tǒng)之后,都會有一個專用的運行環(huán)境.通常每個用戶默認的環(huán)境都是相同的,這個默認環(huán)境實際上就是一組環(huán)境變量的定義.用戶可以對自己的運行環(huán)境進行定制,其方法就是修改相應的系統(tǒng)環(huán)境變量.

什么是環(huán)境變量

環(huán)境變量是一個具有特定名字的對象,它包含了一個或多個應用程序所使用到的信息.通過使用環(huán)境變量,可以很容易的修改一個牽扯到一個或多個應用程序的配置信息.

常見的環(huán)境變量

對于 PATH 和 HOME 等環(huán)境變量大家都不陌生.
PATH 能夠指定命令的搜索路徑,那么動態(tài)鏈接庫的路徑用什么指定呢?或者就是在 PATH 里面?比如有一個程序需要/usr/local/lib 下面的一個庫文件,應該怎么指定其路徑呢?
經(jīng)??吹降哪承┳兞?LD_LIBRARY_PATH,LIBPATH,CLASSPATH 等,他們之間有什么不同的關(guān)系?

  1. HISTSIZE 是指保存歷史命令記錄的條數(shù)
  2. LOGNAME 是指當前用戶的登錄名
  3. HOSTNAME 是指主機的名稱,許多程序如果要用到主機名的話,通常是從這個環(huán)境變量中來取得的
  4. SHELL 是指當前用戶的用的是哪一種 shell
  5. LANG/LANGUGE 是和怨言相關(guān)的環(huán)境變量,使用多種語言的用戶可以修改此環(huán)境變量
  6. MAIL 是指當前用戶的郵件存放目錄.
  7. PS1 是基本提示符,對于 root 用戶是#,度與普通用戶是$.PS2 是附屬提示符,默認是”>”.可以通過修改此環(huán)境變量來修改當前的命令符