BCLinux云主机用户使用手册(三)


  • BCLinux Developers

    本文将介绍BCLinux云主机的基本命令的使用

    1. 基本命令

    1.1 显示时间和日期:date命令

    date命令告诉系统显示日期和时间:

    # date
    Sat Jul 20 14:42:56 EDT 2002
    

    date显示周日期、月份、日期、时间(24小时制、系统时区)和年份。每条Unix命令以按回车键结束,回车的意思是键已经完成,下面该是Unix系统的事了。

    1.2 查看登录系统的用户:who命令

    可以用who命令获得当前登录系统的所有用户的信息。

    # who
    pat    tty29    Jul 19 14:40
    ruth    tty37    Jul 19 10:54
    steve    tty25    Jul 19 15:52
    

    这里登录了3个用户:pat、ruth和steve。除了用户ID外,同时还列出用户的tty编号及其登录系统的日期和时间。tty编号是用户所登录的Unix系统分配给每个终端或网络设备的唯一标识。

    也可以用who命令来获得自己的信息:

    # who am i
    pat    tty29    Jul 19 14:40
    

    who和who am i实际上是同一条who命令,后一种情况中,am和i是who命令的参数。

    1.3 显示字符:echo命令

    echo命令在终端上显示键入在命令行中的其余任何内容。

    # echo this is a test
    this is a test
    # echo why not print out a longer line with echo?
    why not print out a  longer line with echo?
    # echo
    显示一空行
    # echo one two    three    four  five
    one two three four five
    

    从前面的例子可以看出,echo去掉单词之间多余的空格,这是因为在Unix系统中,单词很重要,而空格只不过是单词之间的分隔,一般来说,Unix系统会忽略多余的空格。

    1.4 显示日历:cal命令

    cal命令可以显示当月日历、当年日历、指定月份年份的日历等

    # cal 1 2015
        January 2015    
    Su Mo Tu We Th Fr Sa
             1  2  3
     4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
    

    显示指定月份的日历,只输入cal命令就显示当前月份日历。

    1.5 选择更改当前shell:chsh命令

    chsh命令更换登入系统时使用的shell,每位用户在登入系统时,都会拥有预设的shell环境,这个指令可更改其预设值。若不指定任何参数与用户名称,则chsh会以应答的方式进行设置,例如:新建一个shell

    # chsh
    Changing shell for root.
    New shell [/bin/bash]: 
    

    查看当前使用的是哪个shell

    # echo $SHELL
    /bin/bash
    

    查看机器安装了哪些shell

    # chsh -l
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
    

    把/bin/bash改为/bin/sh

    # chsh -s /bin/sh
    Changing shell for root.
    Shell changed.
    [root@promote tmp]# chsh
    Changing shell for root.
    New shell [/bin/sh]:
    

    1.6 查看网卡:ethtool命令

    ethtool命令是用于查询及设置网卡参数的命令,例如:查询eth0网口基本设置

    # ethtool eth0
    Settings for eth0:
    	Link detected: yes
    

    1.7 设置密码:passwd命令

    passwd命令让用户可以更改自己的密码,而系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码,例如:设置新增用户密码

    # useradd dff1
    # 
    # passwd dff1
    Changing password for user dff1.
    New password: 
    BAD PASSWORD: The password is a palindrome
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    

    1.8 查询linux系统负载:uptime命令

    uptime命令是用来查询linux系统负载的,可以显示当前时间、系统已运行时间、在线用户数、最近1分钟、5分钟、15分钟系统的平均负载

    # uptime
     22:31:21 up 1 day, 41 min,  2 users,  load average: 0.00, 0.01, 0.05
    

    1.9 监视操作系统的虚拟内存、进程、CPU活动:vmstat命令

    vmstat命令可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析

    # vmstat
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0      0 1652056   9640 129676    0    0    42     1   16   20  0  0 99  1  0
    

    每项的解释如下表:

    类别 项目 含义 说明
    Procs r 等待执行的任务数 展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了
    b
    Memory swpd 正在使用的swap大小单位K
    free 空闲的内存空间
    buff 已使用的buff大小,对块设备的读写进行缓冲
    cache 已使用的cache大小,文件系统的cache
    inact
    active
    Swap si 交换内存使用,由磁盘调入内存
    so 交换内存使用,由内存调入磁盘
    IO bi 从块设备读入的数据总量(读磁盘) (KB/s),
    bo 写入到块设备的数据总理(写磁盘) (KB/s)
    System in 每秒产生的中断次数
    cs 每秒产生的上下文切换次数 上面这2个值越大,会看到由内核消耗的CPU时间会越多
    CPU us 用户进程消耗的CPU时间百分比 us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50% 的使用,那么我们就该考虑优化程序算法或者进行加速了
    sy 内核进程消耗的CPU时间百分比 sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。
    id 空闲
    wa IO等待消耗的CPU时间百分比 wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。

    2 文件操作

    Unix系统只能识别3种基本的文件类型:普通文件、目录文件和特殊文件。普通文件是系统中包含数据、文本、程序指令或其他任何内容的文件;目录文件在本章后面会讲到;特殊文件对Unix系统来说有特殊的意义,通常与某种形式的输入/输出相关联。文件名由键盘上所能直接键入的(甚至一些不能直接输入的字符)字符组成,一个文件名中的字符数不能超过255个,如果超过255个字符,Unix系统就忽略超出的字符。Unix系统提供了很多文件操作工具。下面我们将回顾一些基本的文件操作命令。

    2.1 列出文件清单:ls命令

    要查看目录里存了哪些文件,可以键入ls命令:

    # ls
    READ_ME
    names
    tmp
    

    输出结果表明,当前目录中包含了名为READ_ME、names和tmp的三个文件(注意,ls命令的输出因系统而异,比如,有的Unix系统上,Is的结果分多列输出到终端上,而有的系统可能用颜色区别不同的文件类型。总可以用-l选项强制获得单列式的输出结果)。

    2.2 显示文件内容:cat命令

    可以用cat命令查看文件的内容。cat命令的参数是要查看其内容的文件名。

    # cat names
    Susan
    Jeff
    Henry
    Allan
    Ken
    

    2.3 统计文件中的单词数:wc命令

    用wc命令可以统计文件所包含信息的行数、单词数和字符数。这里又需要用文件名作为该命令的参数:

    # wc names
    5    5    2 7  names
    

    wc命令显示3个数字,后面跟文件名。第一个数字表示文件包含的行数(5);第二个数字表示文件中包含的单词数目(本例中也是5);第3个数字表示文件中包含的字符数(27)。

    2.4 复制文件:cp命令

    用cp命令复制文件,它的第一个参数是要复制的文件名(称为源文件),第二个参数是要存入的副本文件名(称为目标文件)。可以按以下方式将文件names复制一份,并取名为saved_names:

    # cp names saved_names
    

    执行该命令的结果是名为names的文件被复制一份存入名为saved_names的文件。与很多Unix命令一样,键入cp命令后,再显示命令提示符就表明该命令成功执行完厂。

    2.5 文件重命名:mv命令

    可以用mv命令给文件重命名。mv命令的参数格式与cp命令一样,第一个参数是要重命名的文件名,第二个参数是要改成的文件名。例如,如果要把文件saved_names更名为hold_it,下面的命令就能实现:

    # mv saved_names hold_it
    

    在执行mv或cp命令时,Unix系统不管第二个参数指定的文件是否已经存在,如果存在,其内容就会丢失。例如,如果存在名为old_names的文件,在执行以下的命令cp names old_names的过程,就会把文件names的内容复制到文件old_names中,文件old_names原来的内容就被替换了。同样,即使在执行该命令之前文件old_names就已经存在,命令mv names old_names会把文件names更名为old_names。

    2.6 删除文件:rm命令

    用rm命令从系统中删除文件。rm命令的参数就是要删除的文件名:

    # rm hold_it
    

    在命令行里指定几个文件名,可以用rm命令一次删除多个文件。例如,以下命令删除wb、collect和mon三个文件:

    # rm wb collect mon
    

    2.7 去掉路径和扩展名显示文件名:basename命令

    basename命令从文件名中去掉路径和扩展名

    # basename /etc/sysctl.conf
    sysctl.conf
    # basename /etc/sysctl.conf .conf
    sysctl
    

    2.8 变更文件或目录的拥有者或所属群组:chown命令

    chown命令变更文件或目录的拥有者或所属群组,在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chown指令去变更文件与目录的拥有者或所属群组,设置方式采用用户名称或用户识别码皆可,设置群组则用群组名称或群组识别码

    # ll
    total 12
    -rw-r--r-- 1 root users 37 Nov 19 03:49 1
    # chown mail:mail 1
    # ll
    total 12
    -rw-r--r-- 1 mail mail  37 Nov 19 03:49 1
    

    2.9 比较两个已排过序的文件:comm命令

    comm命令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3行显示:第1行仅是在第1个文件中出现过的列,第2行是仅在第2个文件中出现过的列,第3行则是在第1与第2个文件里都出现过的列。若给予的文件名称为"-",则comm指令会从标准输入设备读取数据,例如:比较排序过的1和2文件

    # cat 1 
    11111
    11111
    22222
    22222
    # cat 2 
    11111
    22222
    33333
    44444
    # comm 1 2 
    		11111
    11111
    		22222
    22222
    	33333
    	44444
    

    2.10 显示每行从开头算起 num1 到 num2 的文字:cut命令

    cut命令从num1 到 num2 的文字,例如,获取了每行的5-9个字符:

    # cat sysctl.conf 
    # System default settings live in /usr/lib/sysctl.d/00-system.conf.
    # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
    #
    # For more information, see sysctl.conf(5) and sysctl.d(5).
    # cut -c5-9 sysctl.conf
    stem 
     over
    
    r mor
    

    2.11 查找文件或目录:find命令

    find命令用于查找符合条件的文件。任何位于参数之前的字符串都将被视为欲查找的目录,例如,列出后缀是.conf的文件:

    # find /etc -name "*.conf"
    

    2.12 查找文件里符合条件的字符串:grep命令

    grep命令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据,例如:

    # grep 'settings' /etc/s*
    grep: /etc/sysconfig: Is a directory
    /etc/sysctl.conf:# System default settings live in /usr/lib/sysctl.d/00-system.conf.
    /etc/sysctl.conf:# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
    grep: /etc/sysctl.d: Is a directory
    grep: /etc/systemd: Is a directory
    

    2.13 显示文件的前几行内容:head命令

    head命令用于显示文件前几行内容,默认是10行,例如,显示文件 phone_list前20行:

    # head -20 phone_list
    

    2.14 查看文件的后几行内容:tail命令

    tail命令有实时监控的功能,例如,参数-f使tail不停地去读最新的内容,这样有实时监视的效果,用Ctrl+c来终止:

    # tail -f /var/log/messages
    

    2.15 改变文件或目录时间:touch命令

    touch命令可更改文件或目录的日期时间,包括存取时间和更改时间,新建文件,例如,创建了一个文件名为22和11的时间戳相同的文件:

    # touch 22 11
    # ll
    total 64
    -rw-r--r--   1 root root     0 Nov 10 22:08 11
    -rw-r--r--   1 root root     0 Nov 10 22:08 22
    

    2.16 检查及删除文本文件中重复出现的行列:uniq命令

    uniq命令可检查文本文件中重复出现的行列,例如,删除相同的行:

    # uniq
    #
    # For more information, see sysctl.conf(5) and sysctl.d(5).
    # System default settings live in /usr/lib/sysctl.d/00-system.conf.
    # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
    

    3 目录操作

    假定有一组文件,包括各种备忘录、建议和信件等,再假定你有一组计算机程序的文件,把第一组文件组合进documents目录,而把后一组文件放入名为programs的目录,这样做应该是合乎逻辑的。图2-1示意了这种目录组织。

    图2-1 目录结构示例

    文件目录documents包括文件plan、dact、sys.A、new.hire、no.JSK和AMG.reply;目录programs包括文件wb、collect和mon。有时,用户可能想把这些文件进一步分类放入目录。这可以通过建立子目录,并把每个文件放入适当的子目录来实现。例如,要想在目录documents中建立名为memos、proposals和letters的子目录,如图2-2所示。

    图2-2包含子目录的目录

    documents目录包含子目录memos、proposals和letters,每个子目录各包含两个文件:memos包含plan和dact; proposals包含sys.A和new.hire; letters包含no.JSK和AMG.reply。尽管在给定的目录下,每个文件的文件名必须惟一,然而,在不同目录中的文件却不必如此。例如,尽管memos子目录下有一个名为dact的文件,programs目录下也可以存在以此为名的文件。

    3.1 宿主目录和路径名

    Unix系统总是把系统的每个用户与特别的目录联系起来,用户登录进入系统后,系统自动进入宿主目录。尽管用户宿主目录的位置因Unix系统版本而异,甚至不同的用户也不一样,我们还是假定该宿主目录名为steve,该目录实际上是另一个目录users的子目录。因此,如果有documents和programs目录,实际上,总的目录结构应该像图2-3那样。目录树的顶部有一个特殊目录/,该目录称为根目录。

    图2-3 目录层次结构

    3.2 显示工作目录:pwd命令

    pwd命令可以告诉用户当前工作目录的名字。回忆一下图2-3的目录结构,用户登录进入系统后进入的目录称为用户的宿主目录。根据图2-3,可以假定,用户steve的宿主目录是/users/steve,因此,无论何时steve登录进入系统,都会自动进入该目录。可以用pwd命令来验证这种情形:

    # pwd
    /users/steve
    

    命令的输出证实了steve的当前工作目录是/users/steve。

    3.3 改变当前工作目录:cd命令

    可以用cd命令改变当前工作目录,该命令以想转入的目录名作为参数。假定刚登录进入系统,进入了宿主目录/users/steve,这种情形在图2-4中用箭头表达。

    图2-4当前工作目录为steve

    steve的宿主录下有两个直接子目录,documents和programes,实际上,可以在终端上用Is命令来证实这一点:

    # ls
    documents
    programs
    

    ls命令列出了documents和programs两个目录,这与前面例子中列出其他普通文件一样。

    要改变当前工作目录,可以发cd命令,后面跟要转入的目录名:

    # cd documents
    

    执行完该命令后,就进入了documents目录,如图2-5所示。

    图2-5 cd documents

    可以通过pwd命令在终端上验证工作目录已经改变了:

    # pwd
    /users/steve/documents
    

    要转入一个目录的上一级目录,最简单的方法是用命令

    # cd ..
    

    因为按照约定,目录名..总表示上一级目录(父目录,见图2.6)。

    图2-6 cd..

    # cd..
    # pwd
    /users/steve
    

    如果要转入目录letters,可以通过指定相对路径documents/letters,用一个cd命令到达该目录(见图2-7):

    # cd documents/latters
    # pwd
    /users/steve/documents/letters
    

    图2-7 cd documents/leters

    如下面所示可以用一个cd命令向上走两级到达宿主目录:

    # cd../..
    # pwd
    /users/steve
    

    或者,也可以不用相对路径而用绝对路径返回宿主目录:

    # cd /users/steve
    # pwd
    /users/steve
    

    最后,还有第三种方法返回宿主目录,这也是最简单的方法。不管现在的目录路径是什么,不带参数键入cd命令,总可以返回宿主目录:

    # cd
    # pwd
    /users/steve
    

    3.4 创建目录:mkdir命令

    要创建目录,必须使用mkdir命令。该命令的参数就是要创建的目录名。例如,假定还以图2-7表示的目录结构为例,要建立一个与documents和programs平级的目录misc;如果在宿主目录中,键入命令mkdir misc就可以达到预期的目的:

    # mkdir misc
    

    现在,如果再执行一下Is命令,就会看到新建的目录:

    # ls
    documents
    misc
    programs
    

    现在的目录结构如图2-8所示。

    图2—8新建目录misc后的目录结构

    3.5 在目录之间复制文件:cp命令

    cp命令也可以用来把文件从一个目录复制到另一个目录。例如,可以按以下操作把文件wb从programs目录复制到misc目录下的wbx文件:

    # cp programs/wb misc/wbx
    

    因为两个文件在不同的目录中,甚至没必要给两个文件指定不同的文件名:

    # cp programs/wb misc/wb
    

    如果目标文件名和源文件名相同(在不同的目录中),笫二个参数中只有目标目录是必要的:

    # cp progreuns/wb misc
    

    该命令执行后,Unix系统发觉第二个参数是个目录名,就把源文件复制到该目录中,新文件名和源文件名相同。在目标目录前给出多个文件名,就可以把它们都复制到一个目录中,如果当前在目录programs中,命令

    # cp wb collect mon ../misc
    

    会将wb、collect和mon三个文件复制到目录misc中的同名文件。如果要将一个其他目录中的文件以同名复制到当前目录中,可以使用”.”,它表示当前目录:

    # pwd
    /users/steve/misc
    # cp ../programs/collect.
    

    上面的命令把../programs目录中的文件collect复制到当前目录中( /users/steve/misc)。

    3.6 在目录之间移动文件:mv命令

    回想一下,可以用mv命令将文件改名。然而,如果该命令的两个参数使用不同的目录,实际上是把文件从第一个目录移到第二个目录。现在先从宿主目录转到documents目录:

    # cd documants
    

    假定memos目录中包含的文件plan实际上是个建议而不是备忘录,所以想把它从memos目录移到proposals目录。以下的操作可以实现:

    # mv memos/plan proposals/plan
    

    与cp命令一样,如果源文件名和目标文件名相同,则只需要提供目标目录。

    # mv memos/plan proposals
    

    与cp命令一样,在目标目录前给出多个文件名,可以同时把一组文件移动到一个目录:

    # pwd
    /users/steve/programs
    # mv wb collect mon ../misc
    

    这可以把wb、collect和mon三个文件移到misc目录。也可以用mv命令改变目录名。例如,以下命令把programs目录更名为bin:

    # mv programs bin
    

    3.7 链接文件:ln命令

    简而言之,In命令提供了一种简单的方式为一个文件赋予多个文件名,该命令的一般格式是ln from to该命令把文件from与文件to链接起来。回忆一下图2-8中steve的programs目录结构,该目录中存有一个名为wb的程序。假定他也想把该文件叫作writeback,显然可以把wb复制一个副本,称之为writeback:

    # cp wb writeback
    

    该方法的缺点是,这个程序现在要占用双倍的存储空间,更重要的是,如果steve改变了wb,他可能会忘记给writeback复制新的副本,结果导致存在两份不同的副本,而他还认为两者是相同的。通过把wb文件链接到新文件名,这些问题都可以避免:

    # ln wb writeback
    

    现在,不必存在两份文件,只需要有一个文件,两个文件名:wb和writeback。Unix系统将这两个文件从逻辑上链接起来。现在好像有两个不同的文件。执行Is命令会看到两个独立的文件:

    # ls
    collect
    mon
    wb
    writeback
    

    执行一下ls—l命令,看看会怎么样:

    # 1s -1
    total 5
    -rwxr-xr-x  1   steve  DP3725  358  Jun  25   13 : 31  collect
    -rwxr-xr-x  1   steve  DP3725  1219  Jun 25 13:31  mon
    -rwxr-xr-x  2   steve  DP3725  89  Jun 25 13:30  wb
    -rwxr-xr-x  2   steve  DP3725  89  Jun 25 13:30  writeback
    

    文件collect和mon紧靠在steve前的数字是1,而wb和writeback则是2。该数字表示到一个文件的链接数,正常是1,表示没有其他链接的非目录文件。因为wb和writeback链接在一起,它们的链接数是2,这也暗示一个文件可以链接多次。任何时候都可以删除这两个链接在一起的文件中的任何一个,而另一个文件不会被删除:

    # rm writeback
    # ls -1
    total 4
    -rwxr-xr-x  1    Steve    DP3725  358    Jun 25 13:31    collect
    -rwxr-xr-x  l    steve    DP3725  1219    Jun 25 13:31    mon
    -rwxr-xr-x  l    steve    DP3725  89    Jun 25 13:30    wb
    

    注意,文件wb的链接数从2变成了1,因为其中一个链接被删除了。ln最通常的用途是链接不同目录中的文件。例如,假定pat想存取steve的程序wb,他不必为自己复制一份副本(由于以前讨论过相同的问题),也不必在PATH中包括steve的programs目录,他可以从自己的程序目录直接链接到该文件,如:

    # pwd  pat的程序目录
    /users/pat/bin
    # ls -1
    total 4
    -rwxr-xr-x  1    pat DP3822  1358    Jan 15 11:01    lcat
    -rwxr-xr-x  1    pat DP3822  504    Apr 21 18:30    xtr
    # ln /users/steve/wb 把wb链接到Pat的bin目录
    # ls -1
    total 5
    -rwxr-xr-x  1    pat    DP3822  1358    Jan 15 11:01    lcat
    -rwxr-xr-x  2    steve    DP3725  89    Jun 25 13:30    wb
    -rwxr-xr-x  1    pat    DP3822  504    Apr 21 18:30    xtr
    

    注意,尽管该清单是从pat的目录中列出的,wb的所有者仍显示为steve。这样是合理的,因为实际上只有一份文件存在,而它由steve所拥有。关于链接文件的唯一限制是,链接在一起的文件必须共存于同一文件系统,如若不然,当链接它们时,ln命令会报错(要判断系统中有哪些文件系统,可以执行df命令,输出的每一行的第一个字段是文件系统名)。要链接到不同文件系统中的文件(还可能在网络中的不同系统上),可以给ln命令加-s选项,这样可以建立一个符号化链接。符号化链接和普通链接很相似,只有一点不同,符号化链接指向初始文件,如果初始文件被删除了,该符号化链接就不再起作用。我们看看前一个例子用符号化链接会怎么样:

    # rm wb
    # ls -1
    total 4
    -rwxr-xr-x  1   pat     P3822   1358  Jan 15 11:01 lcat
    -rwxr-xr-x  1  pat    DP3822   504  Apr 21 18:30 xtr
    # ln -s /users/steve /wb ./symwb   到wb的符号化链接
    # ls -1
    total 5
    -rwxr-xr-x  1  pat  DP3822  1358  Jan 15 11:01 lcat
    lrwxr-xr-x  1   pat DP3822  15  Jul 20 15:22 symwb-> /users/steve/wb
    -rwxr-xr-x  1  pat DP3822  504  Apr 21 18:30 xtr
    

    注意,symwb的主人显示为pat,而且文件类型是1,表示这是一个符号化链接;文件的大小是15(文件实际上包含的是字符串/users/steve/wb),但当试图存取文件内容时,实际得到的是它所链接的文件/users/steve/wb的内容:

    # wc symwb
    5    9    89    symwb
    

    可以把ls命令的-L选项和-l选项一起使用,以获得符号化列表所指向的文件的详细信息:

    # 1s -Ll
    total 5
    -rwxr-xr-x  l   pat    DP3822  1358  Jan  15  11: 01  lcat
    -rwxr-xr-x 2  steve  DP3725 89  Jun 25 13:30  wb
    -rwxr-xr-x l  pat    DP3822 s04  Apr 21 18:30  xtr
    

    删除掉符号化链接所指向的文件会使符号化链接变得无效(因为符号化链接作为文件名维护),尽管符号化链接依然保留着。

    # rm /users/steve/wb   假定pat可以删除该文件
    # 1s -1
    total 5
    -rwxr-xr-x  1  pat  DP3822  1358  Jan 15 11:01   lcat
    lrwxr-xr-x  1  pat  DP3822  15   Jun 20 15:22   wb -> /users/steve/wb
    -rwxr-xr-x  1  pat  DP3822  504   Apr 21 18:30   xtr
    # wc wb
    Cannot open wb: No such file or directory
    

    该类型的文件称为“悬摆的符号化链接”,应该删除掉,除非有特殊的原因来保留它(比如,打算更换删除了的文件)。在结束该讨论之前,最后要注意的是:In命令遵循跟cp和mv命令相同的格式,这意味着用以下格式立即可以把一串文件连接到一个目录之下:

    # ln files directory
    

    3.8 删除目录:rmdir命令

    可以用rmdir命令删除目录,对删除目录的限制是,被删除的目录中不能包含文件。如果执行rmdir命令时目录中有文件存在,就不能删除该目录。要删除以前建立的misc目录,可以用以下命令:

    # rmdir /users/stave/misc
    

    上述命令只有在misc目录中不含任何文件时才有用,否则就会像下面这样:

    # rmdir /users/steva/misc
    rmdir: /users/steve/misc not empty
    

    如果出现这种情况,还是想删除misc目录,首先得删除目录中的所有文件,然后重新发出rmdir命令。作为删除一个目录及其下面所有内容的替换方法,可以使用rm命令的-r选项,命令格式很简单:rm -r dir其中dir是打算删除的目录名,rm命令删掉指定的目录以及其中的所有文件(包括目录)。

    4 标准输入/输出以及输入/输出重定向

    4.1 标准输入和标准输出

    许多Unix系统从终端接收输入,并把结果发到终端输出。命令通常从称为标准输入的地方输入,默认为终端;同样,命令把输出写入标准输出,其默认也是终端。图2-9描述了这一概念。

    图2-9典型的Unix命令

    4.1.1 标准输入:who命令

    回忆一下who命令,其结果是显示所有当前登录进系统的用户,更正规的说法应该是who命令把登录到系统的用户清单写入标准输出设备。图2-10描述了这一点。

    图2-10 who命令

    4.1.2 标准输出:sort命令

    如果执行sort命令时没有给出文件名参数,它从标准输入接收输入,与标准输出一样,默认是终端。从终端输入数据时,最后一个数据项输入完后,必须同时按Ctrl和d键(文中用Ctrl+d表示),这样告诉该命令数据输入已经完成。例如,用sort命令来将这4个名字排序:Tony、Barbara、Harry和Dick。这次不把这些名字存入文件,而直接从终端输入:

    # sort
    Tony
    Barbara
    Harry
    Dick
    Ctrl+d
    Barbara
    Dick
    Harry
    Tony
    

    因为没有给sort命令指定文件名参数,输入的内容从标准输入——终端取得。键入第4个名字后,按下Ctrl和d键,通知sort命令数据输入已经完毕,这时,sort命令把这4个名字排序,并把结果显示在标准输出设备上,还是终端。图2-11描述了这种情形。

    图2-11 sort命令

    4.2 输出/输入重定向

    4.2.1 输出重定向:>

    命令的输出通常提交到标准输出设备,也可以很方便地转向一个文件来代替,这叫做输出重定向。如果任何命令正常情况下应该把输出写入标准输出,在该命令后添加>file符号后,命令的输出就会写入文件file,而不是写入终端:

    # who>users
    

    该命令行执行who命令,并将它的输出写入文件users。注意,终端上没有任何输出,这是因为输出结果已经从标准输出设备(终端)重定向到了指定的文件:

    # cat users
    oko    tty01    Sep 12 07:30
    ai    tty15    Sep 12 13:32
    ruth    tty21    Sep 12 10:10
    pat    tty24    Sep 12 13:07
    steve    tty25    Sep  12  13:03
    

    如果一个命令输出重定向到一个文件,而该文件已经包含了一些数据,那么,这些数据就会丢失。看看下面的例子:

    # echo line 1>users
    # cat users
    line  1
    # echo line 2>>users
    # cat users
    line 1
    line 2
    

    第二个echo命令使用了另一种类型的输出重定向,由字符>>指示,这一对字符使命令的输出从标准输出追加到指定的文件后面,因而,文件以前的内容不会丢失,新的输出添加到最后。通过重定向添加字符>>,可以用cat命令把一个文件的内容添加到另一个文件之后:

    # cat file1
    This is in file1.
    # cat file2
    This is in file2.
    # cat filel>>file2  把file1添加到file2后面
    # cat file2
    This is in file2.
    This is in file1.
    

    回忆一下,给cat命令指定多个文件名,会在显示第一个文件之后紧接着显示第二个文件,以此类推:

    # cat file1
    This is in file1.
    S cat file2
    This is in file2.
    # cat filel fie12
    This is in filel.
    This is in file2.
    # cat file1 file2>fie13  这次用重定向
    # cat file3
    This is in filel.
    This is in file2.
    

    现在终于知道cat这个名字从何而来了:当用于多个文件时,其效果就是把这些文件连接(catenate)起来。顺便说说,shell能识别一种特别格式的输出重定向,如果键入> file前面没有命令,shell会创建一个空文件(长度为0个字符),如果文件以前已经存在,其内容就会丢失。

    4.2.2 输入重定向:<

    就像命令的输出可以重定向到文件一样,命令的输入也可以重定向为来自于文件。对应于用大于号>表示输出重定向,用小于号<表示命令的输入重定向。当然,只有在正常情况下从标准输入设备接受输入的命令才可以以这种方式把输入重定向到一个文件。要将命令的输入重定向,键入<字符,后面跟要从中读取输入的文件名。例如,要计算文件users中的行数,可以执行wc-l users命令:

    # wc-l users
      2 users
    

    或者,也可以把wc俞令的标准输入重定向到文件users来计数该文件的行数:

    # wc -l<users
    2
    

    注意,wc命令的两种格式所产生的输出有些差别:第一种情况中,users的文件名跟计数值一起显示出来了;而第二种情况中,文件名没有显示。这反映出了这两种命令间的微妙差别:第一种情况中,wc命令知道输入是从文件users中读取的:而第二种情况中,它只知道是从标准输入取得输入,是shell把输入重定向了,所以才从文件users而不是从终端取得输入(详细讨论请见下一章)。至于wc命令所关心的,它不知道输入是来自终端还是来自文件。

    4.2.3 管道:|

    我们前面创建的文件users中包含了所有当前登录进系统的用户的清单,因为对每个登录进系统的用户,该文件中都有相对应的一行,因此可以通过计数users文件中的行数来得出登录系统的用户数:

    # who > users
    # wc -1 < users
        5
    

    输出结果表明,当前有5个用户登录了系统。现在,任何时候如果想知道有多少登录用户,就可以使用这个命令序列。还有另一种方法来判断登录用户数而不需要使用文件。Unix系统可以把两条命令的效果连接起来,这种连接称为管道,它可以把一条命令的输出直接馈入另外一条命令作为输入。管道效果由字符|实现,它必须在两个命令中间,因此,要在命令who和wc_l之间建立管道,只要键入who | wc-1:

    # who | wc -1
    	5
    

    图2-12描述了这两条命令之间管道的作用。

    图2-12管道处理:who | wc-1

    在两条命令之间建立管道之后,第一条命令的标准输出就直接连接到第二条命令的标准输入。who命令把登录用户的清单写入标准输出,而且如果不给wc命令指定文件名参数,它从标准输入获得输入,因此,由who命令产生的登录用户清单就自动成为wc命令的输入。注意,终端上不会看到who命令的输出,因为它直接通过管道进入了wc命令。图2-13描述了这种情况。

    图2-13 管道处理

    只要第一个程序向标准输出写入输出,而第二个程序从标准输入读取输入,就可以在任何两个这样的程序之间建立管道。再举另外一个管道的例子。假定想计数目录中包含的文件数,已经知道Is命令为每个文件显示一行,这样就可以用与以前一样的方法来实现:

    # ls  | wc -l
    	10
    

    输出结果表明,当前目录中包含10个文件。也可以由两个以上的程序构成管道线,前一个程序的输出作为后一个程序的输入。

    5 标准错误

    除了标准输入和标准输出外,还有另一种标准设备,称为标准错误。Unix命令把大部分错误信息都写到这里。与其他两类标准设备一样,标准错误默认也是终端。大多数情况下,根本分不清标准输出和标准错误:

    # ls n*       列出文件名以n开头的所有文件
    n* not found
    

    这里,“not found"信息实际上是由Is命令写入标准错误,而非标准输出,通过重定向Is命令的输出,就可以验证该信息不是写入标准输出的:

    # ls n*>foo
    n* not found
    

    尽管输出重定向到了文件foo,该信息仍然在终端上显示出来了。前例也说明了标准错误存在的合理性:即使标准输出重定向到了文件,或者通过管道输入给其他程序,错误信息仍然可以在终端上显示出来。标准错误也可以重定向到文件,其格式为:命令 2 > 文件,2和> 之间不能有空格。与输出重定向的方法一样,正常情况下应该发往标准错误的信息会转到指定的文件。

    # ls n* 2> errors
    # cat errors
    n* not found

登录后回复
 

与 BC-LINUX 的连接断开,我们正在尝试重连,请耐心等待