跳转到内容

Linux 指南/使用 Shell

来自维基教科书,开放世界中的开放书籍

命令行界面 (CLI 或终端) 乍一看可能令人生畏,但重要的是要记住,命令行确实是你的朋友。无数的工具任你使用,可以将原本需要费时费力的工作(例如从长文件中删除每行的最后四个字符)变成只需要两分钟就能完成的任务。

对于每个 Linux 发行版,命令行提示符看起来都略有不同。例如,在一个系统中,你可能会看到你的用户名、'@' 符号、机器名、当前目录以及提示符。

       user@linux ~/$ 

这是一个非常常见的提示符。你也可以看到你的用户名,一个空格,计算机的完全限定域名,当前工作目录的完整路径,然后是提示符。在上面的示例中,'user' 是用户名,'linux' 是你登录的主机(计算机)的名称。

       user linux.box.com /home/user$ 

提示符因系统而异,这取决于许多因素。例如,它可能是由你的特定 Linux 发行版的创建者设置的默认配置。它也可能由管理计算机的人员配置。也许你自己配置了想要显示的提示符的样子。

配置命令提示符外观的方式取决于你使用的 Shell,而 Shell 是大多数人通常称为“命令行”的部分,而实际上它只是一个提供对内核服务的接口的软件。'Shell' 和 '命令行' 之间的区别仅仅在于 Shell 指的是提供 命令行界面特定软件(例如 BASH、Tch、ksh 等)。大多数现代 Linux 系统使用 BASH (Bourne Again SHell) 作为默认 Shell。

命令行中使用的命令可能看起来有点神秘,因为它们往往非常短。这是因为 Linux 命令行的根源来自那些单个字母输入可能需要大量时间才能从终端传送到中央服务器,然后再传回终端并打印到纸卷上的系统。在那些旧的系统中,输入越短越好,因为这意味着在发出命令和接收输出时等待的时间越短。记住每个命令代表什么词语的最佳方法是找出命令是哪个词语的缩写。这对以后记住命令大有帮助。

一些有用的终端命令

[编辑 | 编辑源代码]

常用命令摘要

[编辑 | 编辑源代码]
  • ls - 此命令 lists 当前工作目录的内容。
  • pwd - 显示你的 present working directory 是什么。
  • cd - 让你 change directories。
  • rm - Removes 一个或多个文件。
  • rmdir - Remove 一个空 directory。
  • mkdir - Make 一个 directory。
  • ps - 提供正在运行的 processes 列表。
  • cp - Copy 一个文件。
  • mv - Move 一个文件(这也被用来重命名文件,将它从一个文件名“移动”到另一个文件名)。
  • grep - global regular expression print 程序允许你在文件或另一个程序的输出中进行搜索。
  • find - 在文件系统中查找文件
  • man - 显示大多数命令的手册(包括 'man')。
提示
有关命令的帮助信息,请尝试 man <command>,这将显示该命令的手册。请注意,一些命令内置在你的 Shell 中,没有手册页,请使用你的解释器内部命令(应该是 help <command>)。

使用常用命令

[编辑 | 编辑源代码]
使用 ls
[编辑 | 编辑源代码]
       user@linux ~/$ ls
       Afilez  Report.doc  aFilea  finances.xls  myPic.jpg  report1.doc  vacation pictures

你可能会从示例中注意到,'ls' 的默认输出中的文件不是严格按照字母顺序排列的。这是因为输出是根据每个字母的数字 ASCII 值排序的。因为大写字母的 ASCII 值比小写字母的 ASCII 值低,所以返回的结果总是先列出以大写字母开头的文件。例如,如果我们在目录中添加 AZTRIP 文件,我们将首先列出 'AZTRIP' 文件,然后列出 'Afilez' 文件,因为 'Z' 的 ASCII 值在数字上低于 'f' 的 ASCII 值。

如果你对字母的 ASCII 值感到困惑,这里需要记住的一点是,大写字母优先于小写字母,并将首先出现在列表中。结果是文件首先按大小写排序,然后按字母顺序排序。

ls 的默认输出不如它可以显示的那么有用。例如,根据示例中的输出,我们不知道哪些是文件,哪些是目录。我们可以推测 "Afilez"、"aFilea" 和 "vacation pictures" 都是目录,因为它们在文件名之后没有扩展名。为了确认这一点,我们可以将 'l' 参数传递给 'ls' 以获得“长列表格式”输出。

       user@linux ~/$ ls -l
       -rw-r--r-- 1 adrong mkgroup-l-d 163328 Jul 24 11:42 AZTRIP
       -rw-r--r-- 1 adrong mkgroup-l-d  11264 Jul 24 11:42 Afilez
       -rw-r--r-- 1 adrong mkgroup-l-d  22528 Jul 24 11:43 Report.doc
       -rw-r--r-- 1 adrong mkgroup-l-d  24576 Jul 24 11:42 aFilea
       -rw-r--r-- 1 adrong mkgroup-l-d 300032 Jul 24 11:43 finances.xls
       -rw-r--r-- 1 adrong mkgroup-l-d  47104 Jul 24 11:41 myPic.jpg
       -rw-r--r-- 1 adrong mkgroup-l-d  17920 Jul 24 11:43 report1.doc
       drwxr-xr-x 1 adrong mkgroup-l-d      0 Jul 24 11:24 vacation pictures

上面的输出中的第一个字符表示文件类型;其中,连字符表示文件,字母 'd' 表示目录。从这个输出中,我们可以看到唯一的目录是 "vacation pictures"

注意
大多数系统对 ls 命令都有别名,以包含 '--color' 标志,以便命令用不同的颜色突出显示不同的文件类型。目录通常显示为蓝色。如果你的 'ls' 命令的输出始终是相同颜色,请尝试 "ls --color"。
提示
ls 命令的另一个常用参数(也称为“参数”)是 'a',它显示所有文件,包括以句点开头的所有隐藏文件和文件夹。参数也可以合并成一个字母块。例如,“ls -l -a”也可以表示为“ls -la”。
使用 cd
[编辑 | 编辑源代码]

cd 命令允许你在系统中从一个目录导航到另一个目录。使用 cd 命令时,你需要知道的第一件事是,与 Windows 不同,Linux 不使用驱动器盘符的概念。相反,所有内容都在根目录 '/' 内,包括其他磁盘驱动器。

使用 cd 导航到想要去的目录有两种方法。它们被称为“完整路径”和“相对路径”。

完整路径始终以根目录 '/' 开头。例如,如果我们在主目录 '/home/user' 中,并且想要导航到 'vacation pictures' 目录,我们将发出以下命令。

       user@linux ~/$ cd /home/user/vacation\ pictures
       user@linux vacation pictures/$ 

您可能会注意到我们的提示略有改变,以指示我们当前所在的目录。在大多数系统上都是如此,但正如之前所讨论的,这取决于您 shell 的配置方式。您可能还会注意到“vacation”和“pictures”之间的反斜杠。此反斜杠称为“转义字符”,它告诉 cd 命令空格是目录名称的一部分。如果省略反斜杠,cd 命令将出错并告诉我们它找不到目录“vacation”。如果您不喜欢键入反斜杠或目录名称中有许多空格,您可以在路径周围使用引号。

相对路径可以从多种方式开始,但始终描述如何从您当前所在的目录获取特定目录。为此,我们需要知道如何移动到直接包围该目录的目录。这些目录是父目录和子目录。

子目录是包含在我们当前所在的目录中的任何目录。鉴于下面“ls -l”的输出,我们看到 chicago、florida 和“new york”都是“vacation pictures”目录的子目录。

       user@linux vacation pictures/$ ls -l
       drwxr-xr-x 1 adrong mkgroup-l-d 0 Jul 24 12:44 chicago
       drwxr-xr-x 1 adrong mkgroup-l-d 0 Jul 24 12:44 florida
       drwxr-xr-x 1 adrong mkgroup-l-d 0 Jul 24 12:44 new york

父目录是包含我们所在文件夹的目录。这使得“vacation pictures”文件夹成为“chicago”、“florida”和“new york”目录的父目录。

要 cd 到子目录,您可以从路径名称开头使用“./”,这表示我们已经所在的目录,或者您可以立即从子目录的名称开始。例如,以下两个命令都将您更改为“florida”目录。

       user@linux vacation pictures/$ cd ./florida
       user@linux florida/$ 
       user@linux vacation pictures/$ cd florida
       user@linux florida/$ 

要 cd 到父目录,您始终指定“../”。以下命令将返回我们到“vacation pictures”目录。

       user@linux florida/$ cd ../
       user@linux vacation pictures/$ 

如果我们已经在“chicago”目录中并且想要 cd 到“new york”,我们必须首先告诉系统我们要向上移动一级到父目录,然后到“new york”目录。我们可以通过说“cd ../”然后“cd new\ york”来做到这一点,或者我们可以使用以下命令一步完成。

       user@linux chicago/$ cd "../new york"
       user@linux new york/$ 
注意
请注意,我们如何在路径周围使用引号来 cd 到“new york”目录。我们本可以改为在空格之前使用反斜杠并省略引号以获得相同的结果。

类似于“./”和“../”,还有“~/”,它表示我们登录的用户的主目录。如果我们想在“/usr/lib”目录中 cd 到“vacation pictures”文件夹,我们可以使用以下任何命令。

       user@linux lib/$ cd ~/vacation\ pictures
       user@linux lib/$ cd "/home/user/vacation pictures"
       user@linux lib/$ cd ../../home/user/vacation\ pictures
提示
在不指定目录的情况下使用 cd 命令将返回您到您的主目录。

复制目录选项

       $cp -frvp /source /destination
        ^   ^^^^    ^        ^
        |   ||||    |        \----------- Path from root is best
        |   ||||    \-------------------- Path to copy from root best
        |   ||||
        |   ||||                          OPTION FLAGS---------------- 
        |   |||\------------------------- Keep permissions
        |   ||\-------------------------- Verbose
        |   |\--------------------------- Recursive files and folders
        |   \---------------------------- Force
        |                                 ----------------------------
        \-------------------------------- Copy command 
cp exam test
-copy file named "exam" to directory named "test"
cp exam .
-copy file named "exam" to current directory (note period at end of command line)


 cp prod/p* reports
   -copy all files beginning with "p" to reports directory
   -can reverse p* to *p for files ending with "p"


将 img 复制到软盘

dd bs=2x80x18b if=/dev/fd0 of=/tmp/floppy.img


将源代码复制到制作 img

dd if=/dev/cdrom of=filename.iso
                    ^------^_________ replace with file name



删除

Remove directory:
       $rm -frv dir/
        ^   ^^^    ^
        |   ||| \---------------------- Remove directory
        |   ||| 
        |   |||                           OPTIONS-------------------- 
        |   ||\-------------------------- Verbose
        |   |\--------------------------- Recursively through all dir 
        |   \---------------------------- Force
        |                                 ---------------------------
        |
        \-------------------------------- Remove command


rm *     <- Delete all files in directory
rm -r    <- Delete directory and contents


Command options for permissions
r = read
w = write
x = execute
X = execute only if user already has execute
s = set user or group id on execution
t = sticky +
u = permission granted to user who owns file
g = permissions granted to group members
o = permissions granted to users other than "u" or "g"




权限

          format:
                   drwxrwxrwx
                   ^^^^^^^^^^
                   ||||||||||
                   |||||||\\\----------- other users
                   |||||||
                   ||||\\\-------------- group
                   ||||
                   |\\\----------------- owner
                   |
                   \-------------------- directory = "d" (possible: -, b, c, q)


                Octal Method: chmod 
                 permissions
    4 = read                   examples: 7 = 4+2+1  will show "rwx" 
    2 = write                            6 = 4+2    will show "rw-"
    1 = execute                          5 = 4+1    will show "r-x"
              
     
  Usage:  chmod 755 FileName          <--- change file permissions
  Usage:  chmod -R 755 DirectoryName  <--- change directory permissions recursively
  will show permissions "-rwxr-xr-x" 
         Note: first character in permissions show what kind of file
             - = file
             d = directory
    b, c, or q = device files


使用格式

chmod -R ugoa =+- rwx filename
       ^ ^^^^ ^^^ ^^^     ^
       | |||| ||| |||     |
       | |||| ||| |||     \---------- file or directory
       | |||| ||| |||                 -----------------------------------
       | |||| ||| ||\---------------- Execute
       | |||| ||| |\----------------- Write
       | |||| ||| \------------------ Read
       | |||| |||                     -----------------------------------
       | |||| ||\-------------------- Remove
       | |||| |\--------------------- Add
       | |||| \---------------------- assign
       | ||||                         -----------------------------------
       | |||\------------------------ All
       | ||\------------------------- Others
       | |\-------------------------- Group
       | \--------------------------- User
       |                              -----------------------------------
       \----------------------------- Recursively through all directories
                                      -----------------------------------
       Usage: chmod g+w filename

此外,还可以分配三个额外的权限

   For files:
         u +-= s  : Set UserID, run as if file-owner
         g +-= s  : Set GroupID, run as if file-group
         o +-= t  : Set "sticky bit", keep executable in swap-space - can only be set by root (no longer supported by Linux-kernel)  
   For directories:
         u +-= s  : Set UserID, files in directory inherits directory's ownership
         g +-= s  : Set GroupID, files in directory inherits directory's group
         o +-= t  : Set "sticky bit", limits the ability to remove a file in a world-writeable directory (like /tmp) to the file's owner.


VI / VIM

VI/M 使用两种模式来处理文本。要处理可用的各种命令,请使用“<esc>”键。要插入文本,只需键入“i”即可返回文本插入模式。


入门/基础------------------------

  Start Vi     vi     [From command line]
  Insert mode  i
  Command mode <esc>
  Save doc     :w   
  Quit app     :q
   
        Usage:  :wq  [will save and exit document]
  Navigation------------------------------
  Right        l
  Left         h
  up           k
  Down         j
  ----------------------------------------

对所有进行排序

   :1,$ !sort

替换文本

   :1,$s /and/AND/g
   ^^^^^   ^   ^  ^
   |||||   |   |  |
   |||||   |   |  \----------- Globally
   |||||   |   \-------------- Replace with
   |||||   \------------------ Find
   |||||
   ||||\---------------------- substitute for text
   |||\----------------------- To last line
   ||\------------------------ separator
   |\------------------------- From line "1"
   \-------------------------- ":" operator to start command processing
Useful tid bit to remove EOL characters from DOS file 
[use key sequence "<ctrl v><ctrl m>" together for EOL char]
 :%s/^M$//

Select Ranges
 :1,$   = All lines in file
 :1,.   = All lines from start of file to current (included)
 :.,$   = All lines from current to end of file (inclusive)
 :.-2   = Single line 2 lines before current line
 :10,20 w abc <enter>    = Write lines 10,20 to new file abc
 :r abc       <enter>    = Reads contents of file abc into working file
 :10,20d      <enter>    = Delete block lines 10 ~ 20

查看行号

 :set number             to disable  :set nonumber

将行写入新文件

 :1,10w abc     [puts lines 1~10 into file abc]

将工作文件从当前文件更改为文件 abc [请确保先保存]

 :e abc

在光标之后将 abc 文件读入工作文件

 :r abc

从提示符执行命令

 :!cmd    [where cmd is could be a bash command]
Example ->    :r !date   [inserts time and date at prompt]

为编程源文本突出显示启用语法选项

 :syntax enable      To disable = :syntax off


VI Navigation  [escape key = <esc>]
0  [zero] = Move to beginning of line
G         = Go to end of file
5G        = Move to beginning of 5th line
u         = Undo
.         = Repeat last command
x         = Delete character
dd        = Delete line
dw        = Delete word
d$        = Delete from cursor to end of line
$ then J  = Join/append following line with current
$ then a  = Append input at end of line
A         = Append input at end of line [same as above, but one less key stroke]
i         = Insert text at cursor
/         = Bottom of screen type search string and <enter> will move 
                 cursor to first occurrence

从 Bash 提示符工作

        lpr -P //PrintServer/PrinterName "file name"
   
        Other options:
        -#  Number of copies [example "-2" for 2 copies]
        -c  Make copy before print



  lpq -P PrinterName : Displays printer status report
  lprm 4      : Removes job #4 from printer
  pr          : Formats, paginates, prints header
                 OPTIONS
                   -d : forces double spacing
                   -h : Customize header
                   -l : Change number of lines per page | default=66
    
          example: pr customers | lpr  <format and print file "customers">
          example: lprm 1006           <canceled job 1006>
  lpstat -s
    ex: lp -n 2 all files
    ex: lp -n 3 all files -d a3printer
    ex: lpstat -d a3printer

另请参见:CUPS

磁盘系统

[edit | edit source]
磁盘空间使用情况:du -h <dir>
列出在 <dir> 中找到的每个子目录的总空间使用量估计值,以及估计的总磁盘空间使用量
文件系统(已挂载)磁盘空间使用情况:df
列出所有已挂载的磁盘以及块总数、已使用、空闲和逻辑磁盘名称
df .
仅列出当前正在工作的已挂载磁盘,以块显示总计、已使用、空闲。
df -h
以人类可读的格式列出所有已挂载磁盘的总计、已使用、空闲和逻辑磁盘名称(KB、MB、GB、TB)。
df -kh
以人类可读的格式列出所有已挂载磁盘的总计、已使用、空闲和逻辑磁盘名称(KB、MB、GB、TB)以及已使用的空间百分比(百分比)[-k] 选项。
列出分区:fdisk -l <disk>
列出硬盘驱动器上的所有分区,例如 fdisk -l /dev/hda
华夏公益教科书