linux使用教程:Linux基础教程的命令的使用

    对于 Linux 新手或者那些想要重新审视或改进自己对基本 Linux 概念(比如:复制和移动文件、创建符号和硬链接、设置文件系统对象所有权和权限以及同管道和重定向起使用 Linux 标准文本处理命令)理解人来说本系列连载文章的是理想教材沿着这个方向我们将起分享很多心得体会、窍门技巧和窍门使该教程甚至对于那些具有丰富经验 Linux 老手来说都是“有血有肉”并且是实用

  对于初学者而言本系列文章许多内容都很新颖而更有经验 Linux 用户可能会发现本教程是使他们基本 Linux 技能“炉火纯青”有效途径

  介绍 bash

  shell

  如果您使用过 Linux 系统那么您知道当登录时将会看到像这样提示符:

$




  您所看到特殊提示符可能看起来很不它可能包含系统主机名、当前工作目录名或者两者都有但是不管这个特殊提示符看起来像什么件事是肯定打印出这个提示符叫“shell”极有可能您特殊 shell 是个叫 bash

  您在运行 bash 吗?

  您可以通过输入下面命令来检查您是否正在运行 bash:



$ echo $SHELL /bin/bash




  如果上面命令行报错或者不会类似地响应我们举例那么您可能正在运行个区别于 bash shell

  有关 bash

  Bash 是“Bourne-again shell”首字母缩写它是大多数 Linux 系统缺省 shellshell 任务是执行您命令使您能够和 Linux 系统进行交互当您输完命令您可以通知 shell 执行 exit 或 logout 命令在此您将返回到登录提示符顺便提您还可以通过在 bash 提示符下按 control-D 来注销

  使用“cd”

  您可能已经发现目不转睛地盯着bash提示符可不是世界上最让人感到有劲那么让我们来开始用 bash 来浏览我们文件系统在提示符下输入下面命令(不包括 $):



$ cd /




  我们只告诉 bash 您想在 /(也称为根目录)中工作;系统上所有目录形成棵树/ 被认为是这棵树顶部或者是根cd设置当前您正在工作目录也称为“当前工作目录”

  路径

  要看 bash 当前工作目录您可以输入:



$ pwd /




  在上面举例中cd / 参数叫做路径它告诉 cd 我们要转到什么地方特别是/ 参数是个绝对路径意味着它指定了相对于文件系统树位置绝对路径这里有几个其它绝对路径:



/dev /usr /usr/bin /usr/local/bin




  您可以看到所有绝对路径有个共同点就是它们都以/开头通过路径/usr/local/bin我们告诉 cd 进入 / 目录接着进入这个目录的下usr目录然后再进入 local 和 bin绝对路径总是通过是否以 / 开头来判断


相对路径

  另种路径叫相对路径在 Bash 中cd 以及其它命令总是解释那些相对于当前目录路径相对路径绝不会以 / 开头这样如果我们在 /usr 中:



$ cd /usr




  那么我们可以使用相对路径来转到 /usr/local/bin 目录:



$ cd local/bin $ pwd /usr/local/bin





  使用“..”

  相对路径还可以包含个或多个 .. 目录.. 目录是指向父目录专门目录那么继续前面举例:



$ pwd /usr/local/bin $ cd .. $ pwd /usr/local





  您可以看到现在我们当前目录是 /usr/local我们能够“后退”到相对于我们所在当前目录个目录此外我们还可以将 \\\\\"..\\\\\\" 添加到个现有相对路径中使我们可以进入和我们已在目录并排目录例如:



$ pwd /usr/local $ cd ../share $ pwd /usr/share




  相对路径举例

  相对路径可以变得相当复杂这里有几个举例所有都没有显示出结果目标路径请试着推断输入这些命令后您最终将会转到什么地方:



$ cd /bin $ cd ../usr/share/zoneinfo $ cd /usr/X11R6/bin $ cd ../lib/X11 $ cd /usr/bin $ cd ../bin/../bin




  现在试验看看您推断是否正确

  理解“.”

  在我们结束 cd 介绍的前我们还需要讨论些更多内容首先还有另个叫 . 专门目录它表示“当前目录”然而该目录不为 cd 命令使用它通常用来执行些当前目录中如下所示:



$ ./myprog



  在上面举例中驻留在当前工作目录中 myprog 可执行文件将被执行

  cd 和主目录

  如果我们想要转到主目录我们可以输入:

$ cd



  没有参数cd 将转到主目录对于超级用户来说是 /root对于般用户来说通常是

  /home/username但是如果我们想要指定个主目录中文件将会怎样呢?可能我们想要将个文件参数传给 myprog 命令如果该文件在主目录中我们可以输入:

$ ./myprog /home/drobbins/myfile.txt



  但是使用像这样绝对路径并不总是很方便幸好我们可以使用 ~(代)来完成同样事:

$ ./myprog ~/myfile.txt



  其他用户主目录Bash 将把单独 ~ 扩展为指向主目录然而您还可以用它来指向其他用户主目录例如如果我们想要引用 fred 主目录中名为 fredsfile.txt 文件可以输入:

$ ./myprog ~fred/fredsfile.txt




使用 Linux 命令

  介绍 \" ls \"

  现在我们将快速地看看 ls 命令很可能您已经很熟悉 ls并且知道只输入 ls 本身将列出当前工作目录内容: $">[b]通过指定 -a 选项您可以看到目录中所有文件包括隐藏文件 — 那些以 . 开头文件您可以在下面举例中看到ls -a 将显示 . 和 .. 专门目录链接:$">[b]递归和索引节点清单

  您可以使用 -d 来查看目录本身而您还可以用 -R 来完成相反工作 — 不仅只查看个目录内部而且要递归地查看该目录内所有目录内部!我们将不会有对应该选项任何举例输出(般占很大篇幅)但是为了感觉下它是怎样工作您可以试几个 ls -R 和 ls -Rl 命令最后ls -i 选项可以用来在清单中显示文件系统对象索引节点号:



$ ls -i /usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp



  理解索引节点第 1 部分

  文件系统每个对象都分配到个独无 2索引叫做索引节点号这可能看起来微不足道但是理解索引节点对于理解许多文件系统操作来说很重要例如请考虑出现在每个目录中 . 和 .. 链接为了完全理解 .. 目录实际上是什么我们将先来看看 /usr/local 索引节点号:

$ ls -id /usr/local 5120 /usr/local /usr/local



  目录有个 5120 索引节点号现在我们来看 看 /usr/local/bin/.. 索引节点号:

$ ls -id /usr/local/bin/.. 5120 /usr/local/bin/..



  您可以看到/usr/local/bin/..具有和/usr/local相同索引节点号!这就是我们抓住问题实质过去我们认为 /usr/local 是这个目录本身

  现在我们发现索引节点 5120实际上是这个目录并且我们发现了指向该索引节点两个目录条目(叫做“链接”)/usr/local 和 /usr/local/bin/..都链接到索引节点 5120虽然索引节点 5120 只在磁盘中地方存在但是多个目录条目都链接到它上面事实上通过使用 ls -dl 命令我们可以看到索引节点 5120 被引用总次数

$ ls -dl /usr/local drwxr-xr-x 8 root root 240 Dec 22 20: 57 /usr/local



  如果我们看看从左起第 2栏我们可以看到目录 /usr/local(索引节点 5120)被引用了 8 次在我系统中引用该索引节点区别路径有这些:

/usr/local /usr/local/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/src/..



  使用 Linux 命令

  mkdir

  我们来快速地看看 mkdir 命令它可以用来创建新目录下面举例创建了 3个新目录:tic、tac 和 toe都在 /tmp 下:


$ cd /tmp $ mkdir tic tac toe



  缺省情况下mkdir 不会为您创建父目录;邻接元素完整路径必须存在因此如果您想要创建目录 won/der/ful您将需要发出 3个单独 mkdir 命令:

$ mkdir won/der/ful mkdir: cannot create directory `won/der/ful': No such file or directory $ mkdir won $ mkdir won/der $ mkdir won/der/ful




mkdir -p

  然而mkdir有个很方便-p选项该选项告诉mkdir创建所有缺少父目录如下所示:

$ mkdir -p easy/as/pie



  总的非常简单要学习更多有关 mkdir 命令知识请输入 man mkdir 来阅读手册页除 cd(它内置在 bash 中)的外这几乎适用于这里所涉及所有命令(比如 man ls)

  touch

  现在我们将要快速地看看 cp 和 mv 命令这些命令用来复制、重命名以及移动文件和目录为了开始该概述我们将首先用 touch 命令在 /tmp 中创建个文件:



$ cd /tmp $ touch copyme



  如果文件存在touch 命令将更新文件“mtime”(请回想 ls -l 输出中第 6栏)如果文件不存在那么将创建个新空文件现在您应该有个大小为零 /tmp/copyme 文件

  echo 和重定向

  既然文件存在我们来把些数据添加到文件中我们可以使用echo命令来完成它带有自己参数并且把这些参数打印到标准输出首先单独 echo 命令是这样:

$ echo \"firstfile\" firstfile



  带有输出重定向同样 echo 命令为:

$ echo \"firstfile\" > copyme



  大于符号告诉 shell 将 echo 输出写到名为 copyme 文件中如果该文件不存在将创建这个文件;如果该文件存在将覆盖这个文件通过输入 ls -l我们可以看到 copyme 文件为 10 个字节长它包括 firstfile 这个词和换行符:

$ ls -l copyme -rw-r--r-- 1 root root 10 Dec 28 14:13 copyme



  cat 和 cp

  为了在终端显示文件内容要使用 cat 命令:

$ cat copyme firstfile




  现在我们可以使用 cp 命令基本来由原始 copyme 文件创建 copiedme 文件:

$ cp copyme copiedme




  通过观察我们发现它们确实是相互独立文件;它们索引节点号区别:

$ ls -i copyme copiedme 648284 copiedme 650704 copyme




  mv

  现在我们来用“mv”命令将“copiedme”重命名为“movedme”其索引节点号将仍然是同个;但是指向该索引节点文件名将改变

$ mv copiedme movedme $ ls -i movedme 648284 movedme





  只要目标文件和源文件驻留在同文件系统上被移动文件索引节点号就将仍然不变在本教程系列第 3 部分我们将进步看下文件系统

  创建链接和删除文件

  硬链接

  当谈及目录条目和索引节点的间关系时我们提到了链接这个术语Linux 实际有两种链接到此为止我们所讨论这种链接叫硬链接个给定索引节点可以有任意数目硬链接该索引节点直存在于文件系统直到所有硬链接消失可以使用 ln 命令来创建新硬链接

$ cd /tmp $ touch firstlink $ ln firstlink secondlink $ ls -i firstlink secondlink 15782 firstlink 15782 secondlink




  您可以看到硬链接工作于索引节点级别指向特殊文件在 Linux 系统上硬链接有几个局限性您只能给文件建立硬链接而不能给目录建立硬链接确如此;即便 . 和 .. 是系统给目录创建硬链接也不允许您(“root”用户也不行)创建任何您自己硬链接

  硬链接第 2个局限性是它们不能跨文件系统这意味着如果您 / 和 /usr 存在于区别文件系统您不能创建从 /usr/bin/bash 到 /bin/bash 链接


符号链接

  实际上符号链接(symbolic link或“symlinks”)比硬链接更常用到符号链接是种专门文件类型在这种文件类型中链接通过名称引用另个文件而不是直接引用索引节点符号链接不阻止文件被删除;如果目标文件消失那么符号链接仅仅是不可用或“被破坏”

  通过将 -s 选项传给 ln可以创建符号链接

$ ln -s secondlink thirdlink $ ls -l firstlink secondlink thirdlink -rw-rw-r-- 2 agrfis agrfis 0 Dec 31 19: 08 firstlink -rw-rw-r-- 2 agrfis agrfis 0 Dec 31 19: 08 secondlink lrwxrwxrwx 1 agrfis agrfis 10 Dec 31 19: 39 thirdlink -> secondlink




  在 ls -l 输出中可以用 3种方式区分符号链接和般文件请注意第栏包含个 l 输出表明是符号链接第 2符号链接大小是目标文件(本例是 secondlink)第 3输出最后栏显示目标文件名

  符号链接通常比硬链接更灵活您可以给任何类型文件系统对象(包括目录)创建符号链接符号链接实现是基于路径(而不是索引节点)所以创建指向另个文件系统上对象符号链接是完全可行但是事实也使符号链接理解起来很复杂请考虑我们想要在/tmp中创建个指向/usr/local/bin链接情况我们应该输入:

$ ln -s /usr/local/bin bin1 $ ls -l bin1 lrwxrwxrwx 1 root root 14 Jan 1 15: 42 bin1 -> /usr/local/bin




  或者还可以输入:

$ ln -s ../usr/local/bin bin2 $ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15: 43 bin2 -> ../usr/local/bin




  您可以看到两个符号链接都指向同目录但是如果我们第 2个符号链接在任何时刻被移动到另个目录由于相对路径缘故它将遭到“破坏”

$ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15: 43 bin2 -> ../usr/local/bin $ mkdir mydir $ mv bin2 mydir $ cd mydir $ cd bin2 bash: cd: bin2: No such file or directory




  /tmp/usr/local/bin这个目录不存在我们不能再把目录转到bin2;换句话说bin2 现在被破坏了

  由于这个原因有时避免用相对路径信息来创建符号链接是个好主意但是在许多情况下相对符号链接很管用请考虑个举例在这个举例中您想要给 /usr/bin 中创建个别名:

# ls -l /usr/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain




  作为 root 用户您可能想要给“keychain”创建个别名比如“kc”在这个举例中我们有 root 访问权由 bash 提示符改变为“#”可以证明我们的所以需要 root 访问权是般用户不能在 /usr/bin 中创建文件作为 root 用户我们可以像下面这样给 keychain 创建个别名:

# cd /usr/bin # ln -s /usr/bin/keychain kc




  当这个解决思路方法起作用时如果我们想要把两个文件都移到 /usr/local/bin 时它将会出现问题

# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin




  在符号链接中我们使用了绝对路径而我们kc符号链接仍然指向/usr/bin/keychain它已不存在了——另个被破坏符号链接符号链接中相对路径和绝对路径都各具优点您应该使用适合于您特殊应用路径类型般情况下相对路径或绝对路径都能工作得很好在这种情况下下面举例将起作用:

# cd /usr/bin # ln -s keychain kc # ls -l kc lrwxrwxrwx 1 root root 8 Jan 5 12: 40 kc -> keychain




rm

  既然我们知道怎样使用 cp、mv 和 ln现在我们该学习怎样把对象从文件系统中删除了通常这用 rm 命令来完成要删除文件只需在命令行中指定它们:

$ cd /tmp $ touch file1 file2 $ ls -l file1 file2 -rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2 $ rm file1 file2 $ ls -l file1 file2 ls: file1: No such file or directory ls: file2: No such file or directory




  rmdir

  要删除目录您有两种选择您可以删除目录中所有对象然后使用 rmdir 来删除目录本身:

$ mkdir mydir $ touch mydir/file1 $ rm mydir/file1 $ rmdir mydir




  rm 和目录

  或者您可以使用 rm 命令 recursive force选项来告诉rm删除您指定目录以及目录中包含所有对象:

$ rm -rf mydir




  般情况下rm -rf 是删除目录树首选思路方法在使用 rm -rf 时要十分小心功能可以被很好地利用也可能会因使用不当造成恶果

  介绍通配符

  在您日常 Linux 使用中有很多时候您可能需要次对多个文件系统对象执行单操作(比如 rm)在这些情况下在命令行中输入许多文件通常让人感到厌烦为了解决这个问题您可以利用 Linux 内置通配符支持这种支持也叫做“globbing”(由于历史原因)允许您通过使用通配符模式次指定多个文件

  Bash 和其它 Linux 命令将通过在磁盘上查找并找到任何和的匹配文件来解释这种模式因此如果在当前工作目录中您有从 file1 到 file8 文件那么您可以输入下面命令来删除这些文件:

$ rm file[1-8]





  或者如果您只想要删除文件名以 file 开头所有文件您可以输入:

$ rm file*




  理解不匹配

  或者如果您想要列出 /etc 中以 g 开头所有文件系统对象您可以输入:

$ ls -d /etc/g* /etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-




  现在如果您指定了没有任何文件系统对象和的匹配模式会如何样呢?在下面举例中我们试图列出 /usr/bin 中以 asdf 开头并且以 jkl 结尾所有文件:

$ ls -d /usr/bin/asdf*jkl ls: /usr/bin/asdf*jkl: No such file or directory




  这里是对所发生情况介绍说明通常当我们指定种模式时该模式和底层系统上个或多个文件匹配bash 以空格隔开所有匹配对象列表来替换该模式

  但是当模式不能找到匹配对象时bash 将不理会参数、通配符等等保留原样因此当“ls”不能找到文件 /usr/bin/asdf*jkl 时它会报错此处有效规则是:glob 模式只在和文件系统中对象匹配时才可以进行扩展
Tags:  linux基础命令 linux系统使用教程 linux基础教程 linux使用教程

延伸阅读

最新评论

发表评论