1. 程式人生 > >linux基礎學習筆記

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 69 10:49 AUTHORS
drwxrwxr-x. 8 guoj guoj    4096 69 10:50 common/
-rwxrwxr-x. 1 guoj guoj   45003 69 10:49 config.guess*
-rw-rw-r--. 1 guoj guoj     866 69 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 比較兩個檔案,報告兩個檔案存在差別的第一個位置