linux基礎學習筆記
man 命令獲取標準的UNIX聯機幫助
- 有八個部分,命令和實用程式;系統呼叫;庫例程;專用檔案(IO);檔案格式;遊戲;其他;專用的系統管理員命令
- apropos keyphrase 查詢包含keyphrase的一個索引列表
% 符號: C Shell, $符號:Bourne Shell
命令都有很多引數,fileneme arguments directives,很多程式的命令引數可以組合,比如
$ ls -l -a
$ ls -la
檔名大小寫敏感,可以包括大小寫字母、數字、點、下劃線、連字元等,但不能包括斜槓/,/用於路徑中分隔目錄。(注意點只是檔名中的一個字元,後續的字元不是副檔名)
根目錄是/,檔案的全名是從根目錄開始的一條完整路徑
$ pwd #顯示當前工作目錄
$ cd ~ # ~代表主目錄
$ printenv PATH # PATH是系統搜尋命令的路徑目錄列表,冒號分隔
/opt/Qt5.9.0/5.9/gcc_64/bin:/opt/Qt5.9.0/5.9/gcc_64/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/guoj/.local/bin:/home/guoj/bin
操作檔案
- echo 結合 > 重定向建立文字檔案
- cat 連線,concatenate,將一組檔案連線起來,結合 > 重定向把檔案連線的結果輸出到檔案
- cat > newfile,會從終端直接讀取輸入,按下Ctrl+D終止輸入,若檔案存在,用>>
- cp 原始檔 目標檔案,拷貝檔案
- mv 原始檔 目標檔案,移動檔案,也可實現重新命名
- ls -la 列出目錄中的檔案 -檔案 d目錄
- rm 刪除指定的檔案
操作目錄
- mkdir 建立新目錄
- rmdir 刪除空目錄,可以先用rm刪除目錄中的檔案,否則有“Directory not empty”的提示
- rm -r 遞迴地刪去目錄,包括該目錄下的所有檔案和目錄
- ls -F 可以將/掛接在目錄上,*掛接在可執行檔案上
- cd 切換目錄, .. 表示當前目錄的父目錄, ~ 表示當前使用者的主目錄/home/user
萬用字元
- 星號 *,匹配零個或多個字元
- 問好 ?,匹配任何單個字元
- [selection],比如[0-9],[a-z]等表示一組連續的字元
* 以.開頭的檔案,*匹配不了,也不必用*.*來匹配副檔名*
檔案訪問許可權
$ ls -lF
總用量 3456
-rw-rw-r--. 1 guoj guoj 1998 6月 9 10:49 AUTHORS
drwxrwxr-x. 8 guoj guoj 4096 6月 9 10:50 common/
-rwxrwxr-x. 1 guoj guoj 45003 6月 9 10:49 config.guess*
-rw-rw-r--. 1 guoj guoj 866 6月 9 10:49 config.h
-表示檔案,d表示目錄;檔案擁有者訪問權;所屬使用者組的訪問權;其他所有人的訪問權;
- chown 更改檔案擁有者
- chgrp 更改檔案的所屬使用者組
- chmod 修改檔案的許可權 chmod who op perm files
- who 修改誰的許可權, u 使用者, g 組, o 其他, a 全部,預設為a
- op + 增加許可權, - 限制許可權, = 指定許可權
- perm r 讀, w 寫, x 執行
- 比如: chmod ug+x test.txt
- 對於目錄,r 可以列出目錄內容, w 可以在目錄中增減檔案,x 可以在目錄中搜索檔案。沒有寫訪問權,但是可以修改目錄中已存在的檔案。
標準輸入和輸出
大多數命令從標準輸入讀資料(終端的鍵盤輸入),將產生的資料寫到標準輸出(終端),錯誤傳送到標準錯誤(終端)
- 標準輸出重定向 >, >>
- 標準錯誤重定向 >&, Shell用1指向標準輸出,2指向標準錯誤
$ cat foop >& errfile
$ cat foop > errfile 2>&1
$ cat foop > outfile 2> errfile # 2和>之間沒有空格
- 標準輸入 <
管道
將一個程式的輸出連線到另一個程式的輸入,過濾器,可以用這個機制先除錯小程式,然後小程式組合起來完成大型任務。比如sample 從輸入裝置採集資料,fourier 讀資料並作傅立葉變換,filter 從傅立葉變換中濾掉高頻成份,plotfourier根據傅立葉變換產生波形。
$ sample | fourier | filter | plotfourier > output.plotfourier
控制程式執行
- Ctrl+C 強制程式執行
- ps -x命令, kill PID
前臺和後臺程式
- 在終端執行命令前臺執行時,在當前程式未結束之前無法做其他工作
- 在命令末尾加&,在後臺執行程式
$ emacs #但是當前終端不能繼續輸入命令,Ctrl+C 強制停止執行
^C $ emacs & #切換到後臺指向emacs,[作業號] PID
[1] 13076
$ jobs
[1]+ 執行中 emacs &
$ fg %1 #fg %作業號 從後臺切換到前臺
emacs
^Z
[1]+ 已停止 emacs #Ctril+D 掛起程式,但不終止
$ bg #把掛起的程式切換到後臺指向
[1]+ emacs &
$ kill %1 #kill %作業號,終止後臺作業
* kill作業號之前有百分號,否則就是kill程序號(root下可能會終止掉系統的程序)*
Shell程式
解釋語言,CentOS使用的是bash《Learning the bash Shell》《學習bash》
$ cat /etc/shells
cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
$ echo $SHELL
echo $SHELL
/bin/bash
$ bash -version
bash -version
GNU bash, 版本 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
許可證 GPLv3+: GNU GPL 許可證版本3或者更高 <http://gnu.org/licenses/gpl.html>
這是自由軟體,您可以自由地更改和重新發布。
在法律允許的範圍內沒有擔保.
- #開頭的解釋為註釋行,第一行#!指定解釋程式去執行該指令碼,python,perl,bash等
- which bash,shell的全路徑名,比如/usr/bin/bash
- 寫好指令碼之後,chmod +x scriptfile, ./scriptfile 來執行
- 讀取命令列引數用
n, 0指命令本身,$1是第一個引數… … - shell變數: name=value,等號前後為空格,value解釋為一個字串,使用$name
- 迴圈
for i in list
do
... ...loop commands for $i
done
- 條件語句,對大多數命令執行沒有任何系統錯誤時返回真,否則為假;cmp比較時相同為真,否則為假;或者程式return/exit返回的值
if command
then
command to execute if command returns ture
else
command to execute if command returns false
fi
#test命令(簡寫為[args])評估一個條件表示式,並相應返回0或1
if [args]
then
...commands
else
...commands
done
#args的基本表示式
str1 = str2 True if str1 equals str2
str1!= str2 True if str1 does not equal str2
-r file True if file exists and is readable
-w file True if file exists and is writable
-d file True if file exists and is a directory
-f file True if file exists and is not a directory
-s file True if file exists and has nonzero length
expr1 -a expr2 True if both expr1 and expr2 are True
expr1 -o expr2 Ture if both expr1 or expr2 is True
#比如
if [ "$1" = "foo" ] # 如果第一個引數時foo
if [ -r file.txt ] # 如果file.txt存在且可讀
shell的設定
.bashrc和.bash_profile, 啟動shell執行的是.bashrc,在系統上登陸時執行.bash_profile(僅執行一次)。
環境變數
PATH供shell和shell啟動的程式使用,TERM表示正在使用的終端型別
$ export VARNAME=value, C shell中是%set VARNAME value
$ printenv
$ export PATH=$PATH:/usr/local/bin 來增加PATH路徑
C shell中是%set path = ($ PATH /usr/local/bin)
shell變數
.bash_profile檔案中有部分變數時控制shell的行為
$ varname=value
% set varname=value
ignoreeof 設定了該變數,Ctrl-D就不會終止shell的執行,必須顯示輸入logout或exit
noclobber 當檔案foo存在時,ls>foo就不能執行
HISTSIZE(bash) 歷史列表中的命令數,可以利用!n取出和執行這些命令
別名
經常執行的命令以及其引數、常拼錯的命令自定義為短命名,新增到.bash_profile中
$ alias newname = 'command', C shell中是% alias newname 'command'
$ alias rm="rm -i" #每次刪除檔案都會請求確認
其他
- grep 在一個檔案或檔案組中查詢“pattern”
- more 允許將太長的檔案分頁顯示在終端,還有less和pg
- sort 將一組輸入行排序,通常以ASCII字符集順序排列
- diff 比較兩個檔案的差異,並列出來
- cmp 比較兩個檔案,報告兩個檔案存在差別的第一個位置