九十分鍾極速入門Linux——Linux Guide for Developments 學習筆記


系統信息:CentOS 64位。

  • 一張圖了解命令提示符和命令行

  • 一些實用小命令

  mkdir(make directory,創建目錄)、ls(list,列出當前目錄下的內容)、rm(remove,刪除文件,如果刪除目錄,需要加參數-r,表示遞歸-recursive刪除)、man(manual,手冊,后面跟命令打開該命令的使用手冊,進入后鍵入/- 參數:查找參數如何使用,n查找下一處,q退出用戶手冊)、ctrl+l(清屏)、pwd(print working dir,顯示工作路徑)、ctrl+a:到達命名行首

更多信息可參見書籍:The Linux Command Line的第二章和第六章(什么是shell、使用命令)

  • 在文件系統中跳轉

  cd(change directory)、.表示當前目錄、./代表當前目錄的子目錄、..表示當前目錄的父目錄、cd /(通過絕對路徑的方式進入根目錄)、cd -(回到原來的目錄)

  Tips:cd 目錄名(和cd ./目錄名的作用相同) 可以通過Tab鍵補齊,如果有多個備選項的話,雙擊Tab列出所有匹配選項

更多參見書籍:The Linux Command Line的第三章(文件系統中跳轉)

  • 操作文件和目錄

  copy:    $ cp file1 file2    $cp -r dir1 dir2

  move:     $ mv file dir/

  rename:    $ mv file1 file2    $mv dir1 dir2   # 如果dir2 存在,則為移動操作

  remove:    $ rm file         $rm -r dir

  創建文件:    $ touch a.txt      $ >a.txt     查看文件:    $ cat file

  創建目錄:    $mkdir dir                 查看文件類型:  $file a.txt

  創建隱藏文件/目錄:touch .文件名 或 mkdir .mydir,通過ls -a可以看到。

  利用通配符刪除當前目錄下的所有文件:rm -rf * 字符串匹配,列出/bin目錄下的所有包含"pin"字符串的文件: ls /bin|grep pin

  下載imooc主頁:wget http://imooc.com

  分頁查看文件內容:less 文件名  (按住j向下滾屏 按住k向上滾屏  /字符:進行字符查找,鍵入n查找下一處 雙擊g可以到達文件頭 點擊G可到達文件尾 q退出),man命令底層的分頁就是用的less,因此less中所有的快捷鍵在man中都是可以使用的。

  放大/縮小/還原終端字體:ctrl + +     ctrl + -     ctrl + 0

  輸入命令后不想執行:ctrl+ c

  解壓縮zip文件:unzip 文件名       壓縮成zip文件:zip -r 壓縮后文件名.zip 被壓縮的文件名

  解壓縮*.tar.gz文件:tar zxvf 文件名   壓縮成tar文件:tar zcvf 壓縮后文件名.tar.gz 被壓縮文件名

  解壓縮*.tar.bz2文件:tar jxvf 文件名   壓縮成tar文件:tar jcvf 壓縮后文件名.tar.gz 被壓縮文件名

  • 重定向

  輸出重定向(redirect stdout):>

  將程序的輸出內容保存到文件中:date >output.txt(注:date是一個系統自帶程序,輸出當前時間)

  cat file1 >file 表示將file1的內容復制到file中  cat file1 >>file 表示將file1的內容追加到file中  cat file1 file2 >file 表示將file1和file2連接到file中

  標准錯誤重定向(redirect stderr):2>

  標准輸入重定向(redirect stdin):<

  (PS:linux下有一個傳統:Everything is a file,如目錄是一個目錄文件,各種設備都被抽象成了文件放到了目錄文件/dev下,系統上有三個非常特殊的文件,因為它們是一直打開的,因此系統為他們分配了三個固定的file descriptor,文件描述符為0的文件叫做標准輸入文件(stdin),為1的叫做標准輸出文件(stdout),為2的叫做標准錯誤輸出文件(stderr),因此你會看到標准錯誤輸出重定向的標識符為:2>)

  一般情況下,標准輸入重定向的使用頻率不如管道,如:cat file1|sort|uniq|grep str(sort對每行字符串進行排序,uniq忽略重復行,grep打印匹配行。PS:uniq命令可以去除排序過的文件中的重復行,因此uniq經常和sort合用。換句話說,為了使uniq起作用,所有的重復行必須是相鄰的。)

  • 用戶和文件權限

  在Linux中有這么一項傳統:home is writable but not outside.

  三種權限:用戶對文件主要有三種權限:r(reading)、w(writing)、x(executing)。

  三種用戶類型:owner、group、world

  對權限的討論就是看owner、group、world對文件的r/w/x權限。

  如在終端中查看文件權限:$ ls - l a.txt,得到結果(注:查看目錄權限,ls -ld mydir):

  -rw-rw-rw-. 1 xpjiang xpjiang 6 12月 23 21:31 a.txt

  該行信息傳達的信息如下圖:

  對文件的r 權限表示可以查看文件的內容(cat file),對目錄的r 權限表示可以查看目錄的內容(ls mydir);對文件的w 權限表示可以編輯該文件里的內容,而對目錄的w 權限表示我們可以在該目錄下創建、刪除、重命名文件;對文件的x 權限表示可以把它作為一個程序來執行,對目錄的x 權限表示我們可以進入該目錄(cd mydir)。

  對當前目錄增加寫權限:chmod +w .

  用vim編輯器創建一個腳本文件a.sh:vim a.sh(鍵入i進入插入模式,寫入一個簡單的打印命令:echo hello,esc退出插入模式,兩次大寫Z保存文件),執行該腳本:./a.sh,一般情況下,我們沒有執行權限,可以這樣做:chmod +x a.sh,執行該腳本,終端輸出:hello。

  chmod(change file mode):chmod 666 a.txt(666為file mode的八進制表示)

  • 進程

  獲取進程號(PID,Process ID)

  終端中啟動vim,它會占據當前的shell,敲Ctrl+Shift+T(編輯->鍵盤快捷鍵中可查看終端中使用的快捷鍵,也可根據需要自定義快捷鍵,例如Ctrl+Shift+C復制內容,Ctrl+Shift+V粘貼)打開一個新的終端標簽,ps aux 查看系統上所有的進程情況,因為輸出篇幅較長,我們可以在ps aux 后面加上管道符(|),用less 程序做分頁器:ps aux|less,輸出中的PID字段,就是我們關注的進程號。鍵入 /vim 進行查找,可以看到vim程序的進程號,不過更一般的查看進程號的方式是用grep 命令查找vim關鍵字:ps aux|grep vim,使用kill vim進程號 就可以結束vim程序(Ctrl+PgUp,切換到上一個終端標簽可以看到vim程序已經被殺死了)。

  后台執行

  在命令行中也可以啟動圖形化程序,如firefox,Alt+Tab 可以切換回命令行,可以看到firefox占據了當前的shell,如何處理這種情況呢?一個簡單的方法是firefox &,這樣firefox就自動在后台執行了,而且切換回終端后命令行依然可以使用。但是如果已經出現了firefox占據了shell這種情況,可以Ctrl+z,發現firefox已經沒有響應了,切回終端,鍵入bg,這樣就跟firefox & 的情況一樣了,fg切換回前台,Ctrl+c 結束firefox(bg:把一個任務放到后台執行,fg:把一個任務放到前台執行)。

  kill

  kill 命令中常用的信號有2、9、15。其中2 表示中斷,實現和Ctrl+c 一樣的功能,由終端發送,通常它會終止一個程序;15 表示終止,是kill 命令發送的默認信號,如果程序仍然"活着",可以接受信號的話;9 表示殺死,這個信號很特別,鑒於進程可能會選擇不同的方式,來處理發送給它的信號,其中也包括忽略信號,這樣9號信號並不發送給目標進程,而是內核立即終止這個進程。當一個進程以這種方式終止的時候,它沒用機會去做些"清理"工作,或者是保存勞動成果。因為這個原因,可以把9號信號看作殺手鐧(kill -9 進程號),當其他終止信號失敗后,再使用它。

  除了通過kill終止進程,很多程序也定義了自己的退出方式,比如shell就可以通過exit 命令退出,它等價於Ctrl+d。

  這里順便說一下一種更糟糕的情況,一個異常的程序占用了大量的內存,導致整個桌面系統卡頓了,使得我們無法在終端中輸入命令,此時怎么辦呢?Linux是同時運行着七個工作台的敲入Ctrl+Alt+F2到達其中一個工作台,在這里殺死那個進程,Ctrl+Alt+F1回到原來運行着圖形化界面的工作台。

  • 查找

  文件和字符串搜索是一個開發者日常工作中頗為重要得一部分,下面就來看看shell中都有哪些命令供我們使用來實現自己的需求:

  locate - 通過名字來在系統全局范圍內查找文件

  例:locate vimrc,locate命令還支持正則表達式:locate --regexp vim[a-z]rc

  使用過程中,有時會發現一個奇怪的現象,如首先touch aa.txt,然后locate aa.txt,發現終端中沒有輸出,通過man locate 了解到locate reads one or more databases prepared by updatedb,換句話說,locate 不是直接搜索整個文件系統,而是從一個數據庫中讀數據,這也就是為什么locate 跑的如此溜的原因,系統中的命令updatedb 會把系統中的數據存放到數據庫之中,但是updatedb 一般都是每天自動運行一次,因此我們剛剛創建的文件locate 是找不到的,解決辦法就是手動運行一下:sudo updatedb。

  find - 在目錄層次結構中搜索文件,支持很多參數,經常與字符串查找利器grep一起使用,用來處理搜索到的文件列表。

  例:find . 列出當前目錄下的所有目錄和文件,包括子目錄的文件和目錄。

    find .|grep .txt,只列出名字包含.txt 目錄和文件

    find . -type f,只列出文件。

    find . -type f -exec ls -l '{}' ';',-exec 的結束符是 ';' ,兩者之間可以輸入任意的系統命令。'{}'代表我們前面找到的文件名。

    echo hello >a.txt   echo Hello >b.txt  find . -type f -exec grep -n hell0 '{}' ';' -print,-print 打印出匹配項(包含字符串"hello")所在的文件,-n 打印出匹配項所在的行號,如果想要忽略大小寫可以在grep 后跟參數 -i,或者直接 -ni。

  • 網絡操作

  網絡操作主要涉及兩塊內容:遠程操作工具ssh和數據傳輸工具rsync。由於沒有可供操作的網絡主機,因此這部分內容暫且略過。更多信息可參見書籍:The Linux Command Line第十七章(網絡系統)。

  • 軟件安裝

  在CentOS上安裝軟件主要有三種方式:

  1. 手動下載編譯好的軟件或者源碼進行安裝
  2. 下載rpm 包安裝(類似於ubuntu系統安裝deb包)
  3. 從官方倉庫,用yum 下載安裝(類似於從ubuntu官網,用apt-get下載安裝)

  手動下載編譯好的軟件(可執行程序)安裝實例:

  從網址 http://sublimetext.com/,下載sublimeText編輯器。使用 tar jxvf Sublime\ Text\ 2.0.2.tar.bz2 解壓縮,但是執行程序必須要用全路徑來執行壓縮包中的sublime_text,如果想方便使用,把它變成一個系統命令,需要把整個解壓縮包中的子文件移動到$ PATH 包含的一個目錄中(使用命令echo $ PATH查看),或者也可以不移動,方法就是搞一個符號鏈接:$ ln -s Sublime\ Text\ 2.0.2/sublime_text ~/bin/subl,如此在終端中直接輸入subl 即可開啟sublimeText編輯器。

  手動下載源碼安裝實例:

  首先從網址 http://ftp.gnu.org/gnu/hello/,下載 hello-2.2.tar.bz2,依次執行命令:

$ tar jxvf hello-2.2.tar.bz2
$ cd hello-2.2
$ ./configure
$ make
$ sudo make install

  終端中執行$ hello,輸出:hello, world!。這里./configure 的作用就是檢查當前環境是否滿足安裝該軟件的依賴關系,make 是用來從Makefile中讀取指令進行編譯的,而make install 是用來從Makefile中讀取指令,將軟件安裝到指定位置的。

  安裝rpm 包:rpm -i rpm包

 使用yum 在線下載安裝:以安裝git 為例:執行命令$ sudo yum install git,git 軟件的rpm 包就被下載到本地硬盤,同時yum 命令包裹了rpm 命令,因此直接把安裝配置過程也給完成了,也就是一個 yum install git 命令,git 就可以直接使用了,如果想卸載git,只需執行 $ sudo yum remove git即可。
  • shell 腳本編程

  把許多命令集中到一個文件中作為一個腳本來執行,就是所謂的shell 腳本編程。

  關於shell 腳本編程我們划分成以下幾個部分一一闡述:

  指定解析器

  可以通過bash、ruby 或python 這樣的語言來寫腳本,只要在腳本的首行指定用什么語法來進行解析即可(bash 的語法很機器化,很多細節也比較晦澀,因此可以用ruby 這種更加人性化的語言來寫腳本)。如:

  #!/usr/bin/env bash  或  #!/usr/bin/env ruby  或  #!/usr/bin/env python

  命令就是語句,語句就是命令

  因為每一個命令都是合法的腳本語句,因此可以把多條語句直接羅列到腳本中,也可以將其包裹到一個函數中:

  #!/usr/bin/env bash
  say_hello()
  {
    echo "hello"
  }
  create_file()
  {
    touch a.txt
  }
  say_hello # 通過呼叫函數名來執行
  create_file 

  此外,還有些元素是腳本語句的一部分:

 if [ $# != 1 ]
  then
    echo "hello"
  fi 
 注意到,這里的[ $# != 1 ] 其實也可以放到終端中去執行 
  $[ $# != 1 ]
  $ echo $?
  0
 查看返回指為0 表示命令執行成功。只要if 后面跟一個可以正確執行的命令,則結果為真;如果跟一個執行會出錯的命令,那么結果即為假。此外,由於命令對空格是敏感的,這就導致腳本語句對空格也是變態的敏感。

  位置參數

  執行下面的腳本: $ ./xpjiang.sh a.txt b.txt(執行前需要$ chmod +x xpjiang.sh): 

  #!/usr/bin/env bash
  echo "
  Number of arguments: $#
  The program name is: $0
  The first argument is: $1
  "

  輸出如下:

  Number of arguments: 2
  The program name is: ./xpjiang.sh
  The first argument is: a.txt

  這里的$0 代表命令名,$1 代表第一個參數,$2 代表第二個參數...,$# 表示該命令執行時的參數總個數。

  腳本不再當前shell 中執行

  每次啟動一個腳本,系統都會為當前shell 單獨開啟一個子shell,在子shell 中執行腳本中的語句。例如,腳本中導出一個環境變量:

  #!/usr/bin/env bash
  export Direct="/home/xpjiang/mydir/"
  cd $Direct
  touch hello.txt

  執行$ ./xpjiang.sh 會發現,當前shell 中echo $Direct 得到的輸出為空並且當前shell 中的工作目錄也沒有改變,這就說明腳本不在當前shell 中執行。如果需要腳本在當前shell 中執行,則執行 $ source xpjiang.sh,可以發現目錄切換到了mydir 下,同時echo $Direct 的輸出為/home/xpjiang/mydir。

  循環控制 

  編寫腳本rename.sh,更改模式為可執行:

  cd $1
  echo I am in `pwd`  # `pwd` 會取出該命令的輸出
  for file in `ls`
  do
    mv $file $file.txt
  done

  添加到 ~/bin 中,使其成為一個系統命令。執行:

  $ mkdir mydir
  $ cd mydir; touch a b c; cd ..
  $ rename.sh mydir  I am in /home/xpjiang/Desktop/mydir
  $ ls mydir
  a.txt b.txt c.txt

  遠程控制

  SSH 遠程登錄服務器的時候,需要先登錄再執行命令,實際中每次這樣操作很麻煩。可以在本地寫一個腳本,在服務器上執行腳本中相關的命令。

  確認執行

  讓程序在執行過程中暫停,報告一些信息,用戶根據程序提供的信息判斷是否允許程序繼續執行下面的操作,這就是確認執行。

  #!/usr/bin/env bash

  echo -n "Do you want to say hello? (y/n): "
  read AAA
  if [ "${AAA:-y}" = "y" ]; then
      echo hello
  else
      echo Nothing done, bye.
  fi 

 

 Reference: MOOC_Liunx Guide for Developments. 

最后:
轉載請注明出處.
以上.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM