Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2499984
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-08-18 23:10:19

在Linux中善用重定向提高工作效率

文件的输入/输出重定向是 Linux 系统中一个重要的机制。借助于重定向用户往往可以比较轻松地完成某些任务, 从而提高工作效率。本文结合作者的使用经验, 列举和总结了一些使用输入/输出重定向的实例和技巧。

文件输入,输出和错误输出

当 Shell 运行一个新的应用程序或命令时,它会为进程自动创建三个文件描述符,即标准输入(stdin),标准输出(stdout)和标准错误输出(stderr)。它们被分别赋值为 0,1 和 2。标准输入通常默认为终端的键盘,标准输出和标准错误输出通常默认为终端的屏幕。在默认情况下,应用程序会从 stdin 中取得输入数据,并把输出数据和出错信息分别传送给 stdout 和 stderr。重定向就是要改变这些 stdin、stdout 及 stderr 默认的去向。重定向包括输入重定向和输出重定向。

输出重定向

简单地说,输入重定向就是把应用程序的标准输出或标准错误输出重新定向到某个指定的文件,而不是原来默认的标准输出,比如屏幕。它的操作符是">"或">>"。运用输出重定向可以比较方便地生成,编辑某些文件;比较容易地和系统中的某些设备文件进行交互。下面是一些实例。

列出 home 目录下所有的 csv 文件并把结果保存到文件 csv.out 中:

[wei@amt55 home]# find /home -name "*csv" > csv.out

获取系统内存使用信息并追加到文件 sysinfo.out 中:

[root@amt55 info]# cat /proc/meminfo >> sysinfo.out

如果不想让别人在网络上 ping 到自己的机器,可以这么做:

[root@amt55 /]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

如果不想看到某个命令执行的结果,可以这样将其丢弃:

[root@amt55 /]# ls -aR /home/wei > /dev/null

把文件 backup.tar 拷贝到软盘里:

[root@amt55 ladungmss]# cat backup.tar > /dev/fd0

迅速清空文件 parametertest.in 中的内容:

[root@amt55 ladungmess]# cat /dev/null > parametertest.in

想播放声音文件 wallstart.au 吗,太简单了:

[root@amt55 sounds]# cat wallstart.au > /dev/audio

直接把文件 dma.ps 送到打印设备去打印:

[root@amt55 ladungmess]# cat dma.ps > /dev/lp

在当前目录 ladungmess 下快速创建一个名为 rawdata.csv 的空文档:

[root@amt55 ladungmess]# cd /home > rawdata.csv 或者[root@amt55 ladungmess]# cp wei001.csv /home/ > rawdata.csv

这是因为命令 cd 或 cp 是不产生输出的,所以把它们运行的结果重定向到一个文件,文件自然是空的。下一节还将介绍一个利用输入重定向来创建空文件的例子。

将当前目录下包含的所有内容备份为一个文件 backup.tar:

[root@amt55 ladungmess]# tar cf - . > backup.tar

上面的命令巧妙地运用了两个输出重定向,即"-"和">"。对"-"的解释可以参见下一节中关于 tar 的例子。

输入重定向

输入重定向是把应用程序的标准输入重新定向到指定的文件。这就可以使程序的输入源不限于键盘,也可以来自文件。输入重定向的操作伏符是" <"或">>"。与输出重定向相比,输入重定向运用的地方要少一些。不过在某些情况下使用它们可以起到很好的效果。下面是一些实例。

在当前目录下快速创建一个空文档 rawdata.dat:

[root@amt55 ladungmess]# cat > rawdata.dat < /dev/null

在局域网上给其他人发送信息:

[root@amt55 ladungmess]# mail -s "The experiement results" user1 user2 < rawdata.dat

统计文件 ladvertest.out 中的行数和字数:

[root@amt55 ladungmess]# wc -l -w < ladvertest.out

利用 Here 文档把两个分隔符 END 之间的文本保存到文件 expfile:

[root@amt55 ladungmess]# cat > expfile << END

< The experiment file

< ladvertest.in ladvertest.out

< END

将当前目录 ladungmess 下的所有东西打包压缩,快速移动到另一个目录 backup 下:

[root@amt55 ladungmess]# tar cf - . | (cd /home/wei/backup; tar xvfp -)

这个命令对于在不同目录之间转移文件很有用。需要注意的是这里的重定向与前面那些例子不太一样,其标志是符号"-"'。 第一个"-"是一个输出重定向,它要求 tar 的输出(压缩的包)不是某个磁盘文件,而是 stdout,这个 stdout 通过管道变为第二个命令 tar 的 stdin; 第二个"-"是一个输入重定向,它要求第二个 tar 的输入不是来自某个磁盘文件,而是来自 stdin,也就是由管道传来的第一个 tar 的 stdout。

最后介绍一个目前实验数据处理中碰到的使用重定向的例子。为了从测量数据中得中纳米颗粒的电荷分布,需要运行某些与用户交互的程序。其中的一个程序是parameter,是用 C++ 编写的。它用来读取实验数据,并按照用户提供的与颗粒有关的各种参数去拟合出一个与实验数据最接近的分布。这实质上是一个不断尝试(trial-and-error)的过程。因为不能保证只通过一次或几次运行程序就得到理想的结果。每次运行 parameter 我都要连续从键盘输入十一个参数 (为了便于理解,我把 parameter 的源程序放在 这里)。这样做有几个不合适的地方: 一是参数比较多,输入一次要占用不少时间。其次大部分参数在调整几次后就不需要再变了,而文件名在某次实验中一直都是不变的,但是下一次运行程序时所有这些都还要重新输入。再有多次输入也容易发生输错的情况。输入重定向帮我很好解决了这一问题: 把这十一个参数按照它们在程序中出现的次序放在一个名为 parametertest.in 的文件中,格式如下(对应其中某一次输入,第一行 parametertest.csv 是实验数据文件名):

prametertest.csv11-6000 -5400

1.05 1.20.066 0.0681e3 1e5

然后运行:

[root@amt55 ladungmess]# ./parameter < parametertest.in

现在立刻就可以获得计算结果了。如果不满意,下一次尝试我只要在文件 parametertest.in 中修改那些需要改变的参数就行了。很明显,由于输入重定向接管了每次从键盘输入的工作,所以运行程序的效率大大提高了。如果对输入的参数满意了,可以再使用一个输出重定向:

[root@amt55 ladungmess]# ./parameter < parametertest.in > parametertest.out

把计算结果保存到文件 parametertest.out 中。

结论

重定向能够运用的场合很多,上面列举的十几个例子只是其中很小的一部分。不过从这有限的例子中不难发现,运用重定向处理某些问题是相当巧妙和简洁的,善于利用重定向往往会给工作带来许多方便,从而显著地提高工作效率。

红联Linux论坛:

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

113楼 旧帖 06-07-17 23:32

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

正确处理Linux里的密码

在Linux里,有很多API函数是用来处理密码的,但是这只能解决一半的问题。你不得不使用好的密码处理办法。例如,只有在绝对必要的时候才使用纯文本密码这种(安全)策略。

  

  暴露纯文本(密码内容)的唯一机会是在进行身份验证时询问用户密码的时候。有一些可用的API函数能够减少这种风险,包括加密,这应该在获得用户密码之后立即进行。

  

  密码处理的第一条原则是,绝对不要将纯文本的密码写到磁盘上??即使是你会立即删掉的临时文件。一旦数据到了磁盘上,你在使用之后就很难保证数据没有丢失。

  

  虽然这个原则看起来似乎很简单,但是你必须要记住:Linux使用的是虚拟内存。如果你加载了交换分区,内存(里的内容)会在任何时候被写到磁盘上。为了防止密码缓冲区被写到交换分区上,你可以使用mlock API调用:

  

  const intsz = 25;

  char *buf = malloc(sz);

  mlock(buf, sz);

  memset(buf, 0, sz);

  

  为了确保缓冲区真的被锁定了,你必须至少向每个内存页写入一个值。

  

  另一个重要的原则是,决不要将输入的密码反馈到终端上。你可以编写自己的函数或者使用getpass函数,它像下面这样工作:

  

  const char prompt[] = "Password: ";

  char *pword = NULL;

  pword = getpass(prompt);

  

  有时候你无法使用getpass。在这样的情况下,你将需要编写自己的getpass函数。下面就是一个例子:

  

  #include

  #include

  

  ssize_t

  my_getpass (char **lineptr, size_t *n, FILE *stream)

  {

  structtermios old, new;

  intnread;

  

  /* Turn echoing off and fail if we can't. */

  if (tcgetattr (fileno (stream), &old) != 0)

  return -1;

  new = old;

  new.c_lflag &= ~ECHO;

  if (tcsetattr (fileno (stream), TCSAFLUSH, &new) != 0)

  return -1;

  

  /* Read the password. */

  nread = getline (lineptr, n, stream);

  

  /* Restore terminal. */

  (void) tcsetattr (fileno (stream), TCSAFLUSH, &old);

  

  return nread;

  }

  return nread;

  }

  

  很显然,传递到函数里的缓冲区应该首先被锁定。

  

  可插拔验证模块(PAM)

  

  PAM是一个模块化的系统,它将验证、密码管理、会话管理,以及帐号管理抽象出来。它授权被编写用来同PAM一起工作的应用程序来使用各种模块,并允许这些模块被卸载或者被别的模块替换,而不需要重新编写应用程序。

  

  PAM允许你以一种安全的方式进行本文所讨论的所有事情,而不要在你为不同系统编写新应用程序的时候从头再来。除非有什么特定的理由不使用它,我都建议你使用PAM。你会发现它要比实现一个更老的系统或者编写一个你自己的系统更加理想。

红联Linux论坛:

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

114楼 旧帖 06-07-17 23:32

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

做好Linux的管理员:21问

70.如何检查Linux硬盘使用情况?

在Linux环境下,你可以使用df命令来查看硬盘的使用情况。下面就是一个df ?T ?h(-T参数:显示文件系统类型,-h参数用可读性较高的方式来显示信息)命令的输入实例:

Filesystem Type Size Used Avail Use% Mountedon

/dev/hda1 ext2 7.5G 4.7G 2.5G 65% /

/dev/hda2 ext2 653M 6.6M 613M 1% /root

/dev/hdb1 ext2 7.5G 3.5G 3.7G 49% /usr

71.Linux下有哪些压缩工具?

在Linux下有很多种压缩工具,常用的有:

1) gzip/gunzip:这是GNU开发的自由软件,使用相当广泛。压缩文件扩展名为“.gz”。使用方法很简单,例如:

gunzip eos.gz gzip /home/test/*.txt;

2) compress/uncompress:这是一对历史悠久的压缩程序,文件经过它压缩后,压缩文件扩展名为 “.Z”。

3)除此之外还有:zip/unzip、bzip2/bunzip2等。

72.如何管理进程?

进程是程序的一次执行。可以使用“ps ?auxw”列出在当前正在执行的进程的详细信息,包括每个进程都有的进程ID号。你可以通过“kill 进程ID号”来终止这个进程。

73.文件或目录的权限是什么意思?

文件或目录的权限位由10位构成,如-rwxr-xr-x。

1) 第一位代表文件/目录类型:d代表目录、-代表文件、l代表链接;

2) 剩下的9位分成3组,每组3位;2-4位描述文件主人的权限,5-7位描述与文件主人同一用户组的权限,8-10位则是其它用户的权限。

3) rwx:每组的3位分别是:读权限、写权限、执行权限;如果是-就代表没有这个权限。

也就是说-rwxr-xr-x表示,这是个普通文件,文件主人可以读、写、执行这个文件,与文件主人同组的用户以及其它用户都可以读、执行这个文件。

74.什么是用户帐号?

在Linux系统中,是通过用户帐号来标识每一个用户的,通过登录时输入不同的用户帐号和密码确定你的身份。也就是说,Linux系统通过用户帐号和管理系统的所有用户。

然后你可以创建一些用户组,将用户加入到组中去,让其获得用户组的权限。

75. 在Linux下,如何管理用户?

如果你想要新增一个用户:

1) 以root登录,然后执行“adduser 用户帐号名”

2) 执行“passwd 用户帐号名”来为这个用户帐号设置密码。

执行“userdel 用户帐号”删除一个用户;

执行“groupadd 用户组名”新增一个用户组;

执行“groupdel 用户组名”删除一个用户组;

76. 如何为用户作磁盘限额?

1)将要设置磁盘限额的分区,按以下格式修改/etc/fstab 文件:

/dev/hda2 /home ext2 defaults,usrquota 1 2

2)在要设置磁盘限额的分区目录下创建空文件 quota.user

#touch /home/quota.user

#chmod 600 /home/quota.user

3)重启系统后,就可以使用edquota ?u 用户名来设置。

77.如何备份系统?

在Linux中,你可以使用dump/restore命令组来实现系统的备份与恢复。假设你需要将/usr目录下的所有文件完整地备份到磁带机上(假定设备是rmt8,不同的磁带机不相同),你可以使用命令:

dump ?O ?f /dev/rmt8 /usr

其中-O参数代表备份全部文件,“-f 设备文件名”参数指定备份到什么地方,最后的目录名指定要备份的内容。

然后,你可以使用以下命令恢复:

restore ?r ?f /dev/rmt8

78.如何安装.tar的软件包?

Linux软件有两种发布方式:一种是源代码方式,另一种是可执行文件包。而发布包大多是先用tar归档,再用gzip压缩,生成是以.tar.gz结束的文件。

你可以直接使用“tar xvfz 文件名”完成解压缩,解tar包工作。

如果你取得是可执行文件包,安装工作结束。

如果你取得是源代码包,则还需编译一下:

1) 在解压目录下运行“./configure”进行配置;

2) 在解压目录下运行“make”进行编译;

3) 运行“make install”安装。

79.如何使用RPM安装Linux软件?

RedHat公司提供的RPM工具,使得Linux软件安装更为方便。

1) 安装:rpm ?ivh somesoft.rpm

2) 反安装:rpm ?e somesoft.rpm

3) 查询:rpm ?q somesoft

80.如果忘了root的密码,怎么办?

如果你忘了root的密码,可以通过以下方法恢复:

1) 重新启动Linux,出现lil时,输入linuxsingle进入单用户模式;

2) 这时无需密码就取得了root权限;

3) 再运行passwd重新设置root的密码。

81.重装Windows而破坏了Lilo时,怎么办?

这种情况可以使用两种方法恢复:

1)用Linux启动软盘启动,然后执行/sbin/lilo,重新在引导区建立lilo;

2)使用Linux安装光盘启动,选择升级系统,将会重建lilo。

82.如何制作Linux启动盘?

在Linux下,有一个工具mkbootdisk能很方便地制作系统启动盘:

1) 查看系统的版本,可以通过ls /usr/src来看;

2) 插入一张空软盘;

3) 执行“mkbootdisk verbose 2.2.5”。

83.如何远程使用Linux?

我们可以使用telnet、rlogin、rsh、rcp等命令来实现远程使用Linux,但这这些方法在传输过程中是明文传输的,所以有可能带来许多不安全因素。因此,应尽量避免远程使用root帐户登录系统。

如何构建安全的远程登录?

使用SSH来实现安全的远程登录,因为SSH实现了数据传输的加密。

1) 从ftp.cs.htu.fi/pub/ssh获取ssh-1.26.tar.gz文件;

2) 用tar xvpf ssh-1.26.tar.gz解开这个包;

3) 到解开的目录/usr/local/src/ssh-1.26目录下执行./configure;

4) 执行make和make install来完成编译和安装。

5) 你就可以使用ssh来与安装了SSH的服务器建立安全的远程连接。

85.如何运行计划任务?

大大可能对Windows中的计划任务都比较熟悉了,它可以通过一些简单的设置,定时完成一些任务。在Linux系统的维护中,我们可以也会需要定期执行一些任务,这种情况可以使用:

1) at命令:它可以键盘或文件中读取指令,然后在指定时间完执行;

2) crontab守候进程:通过设置它的配置文件来定时执行某些任务。

86.Linux的开机过程都做了什么?

1) 一开机,CPU将控制权交给BIOS,BIOS完成开机自检;

2) 然后BIOS读取磁盘上的第一个扇区,并装入主引导扇区的lilo;

3) lilo根据输入选择不同的内核映象,如果你选择了linux就读取/boot下的核心映象;

4) 核心开始硬件检测和设备驱动程序的初始化,然后运行init

5) init进程根据/etc/inittab的配置运行一系列初始化脚本;

6) 完成后,启动getty进程接受用户的登录。

87.如何设置开机自动运行程序?

你可以在以下几个脚本文件中加入你想一启动系统就执行的命令:

/etc/rc.local、/etc/rc.sysinit以及/etc/rc.d/init.d。

88.为什么需要重新编译内核?

以下情况你需要重新编译内核,或加入动态内核模块:

1) 更新驱动程序;

2) 根据自己男枨蠖ㄖ谱羁煽康哪诤耍?

3) 升级Linux内核。

89.如何重新编译内核?

1) 进入Linux源代码目录:cd /usr/src/linux

2) 执行“make config”或“make menuconfig”、“make xconfig”配置内核选项,选中你想要的模块,去掉不想要的模块;

3) 执行“make zImage”命令,大概30到90分钟后,会生成一个zImage的新内核映像文件,存放在/usr/src/linux/arch/i386/boot目录下;

4) 然后将其拷贝到/boot目录下;

5) 修改lilo.conf文件,加入:

image=/boot/zImage

label=newlinux

root=/dev/hda1 (根据原来的文件)

运行/sbin/lilo使修改生效。

6)重新启动,在Lilo时,输入newlinux就可以新内核启动。

90.什么是动态内核模块?

动态内核模块是Linux一个成功的设计,它使得Linux更加灵活,易于定制。其实动态内核模块就是一个内核模块,它可以在不重新编译内核的情况,动态地将一些功能用“insmod 模块名”命令加入内核、用“rmmod 模块名”命令将其移出内核。

红联Linux论坛:

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

115楼 旧帖 06-07-17 23:32

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

bash入门基础

前言

本文译自《Slackware Linux Unleashed》(第三版)一书的 bash 一章,但做了一些必要的删节,并且有的地方根据实际情况作了较大的改动,必要的话请参考原文。

简介

本文将较为详细地介绍 Linux 下最常用的 shell,bash。bash(Bourne Again Shell) 是 Linux 的缺省 shell,并被大多数用户所使用,在本文中你将学会:

什么是shell

Linux上最常见的shell

命令补齐(Command-line completion)和通配

命令历史记录(Command history)和别名

重定向和管道

改变提示符

进程控制(Job control)

如何用户化配置你的bash shell

另外你还将看到一些最常用的bash命令和内存变量的用法,读完本文后你将能更快和更有效地使用bash。

Shells in a Nutshell

什么是shell?总之这个词好象总是出现在 Linux 里,但很多新用户并不清楚它的明确的含义。本节将给出一个确切的解释并说明为什么在Linux中它显得如此的重要。

什么是Shell?

shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。

--------------------------------------------------------------------------------

注意: 如果你熟悉m$-dos,你将认出这很象DOS 用户和 COMMAND.COM之间的关系。唯

一的区别是command.com 的功能远不能和shell 相提并论。

--------------------------------------------------------------------------------

shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。

不论何时你键入一个命令,它都被Linux shell所解释。一些命令,比如打印当前工作目录命令(pwd),是包含在Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还是一个单独的程序。

附图展示了 shell 是如何执行命令解释的,shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux本身的实用程序,比如ls 和 rm,也可以是购买的商业程序,比如 xv,或者是公用软件(public domain software),就象 ghostview。然后shell试着在搜索路径里寻找这些应用程序。搜索路径是一个能找到可执行程序的目录列表。如果你键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。而如果命令被成功的找到的话,shell的内部命令或应用程序将被分解为系统调用并传给Linux内核。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell 程序设计语言支持在高级语言里所能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。shell 编程语言很易学,并且一旦掌握后它将成为你的得力工具。任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重复执行某一任务。

shell 如何启动

shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。你系统上的每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的passwd文件里被指定,该文件的路径是/etc/passwd。passwd文件里还包含有其他东西:每个人的用户ID号,一个口令加密后的拷贝和用户登录后立即执行的程序,(注:为了加强安全性,现在的系统一般都把加密的口令放在另一个文件--shadow中,而passwd中存放口令的部分以一个x字符代替)虽然没有严格规定这个程序必须是某个Linux shell,但大多数情况下都如此。

最常用的shell

在Linux 和 UNIX系统里可以使用多种不同的shell可以使用。最常用的几种是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三种shell 都有它们的优点和缺点。Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 并且在每种 UNIX 上都可以使用。Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。

C shell 由 Bill Joy 所写,它更多的考虑了用户界面的友好性。它支持象命令补齐(command-line completion)等一些 Bourne shell 所不支持的特性。普遍认为C shell 的编程接口做的不如 Bourne shell, 但 C shell 被很多 C 程序员使用因为 C shell的语法和 C语言的很相似,这也是C shell名称的由来。

Korn shell (ksh) 由 Dave Korn 所写。它集合了C shell 和 Bourne shell 的优点并且和 Bourne shell 完全兼容。

除了这些 shell 以外,许多其他的 shell 程序吸收了这些原来的 shell 程序的优点而成为新的 shell 。在 Linux 上常见的有 tcsh (csh 的扩展),Bourne Again shell(bash, sh 的扩展), 和Public Domain Korn shell (pdksh, ksh 的扩展)。bash 是大多数Linux 系统的缺省 shell。

The Bourne Again Shell

Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。bash 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。

为什么要用 bash 来代替 sh 呢?Bourne shell 最大的缺点在于它处理用户的输入方面。在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时。而 bash 准备了几种特性使命令的输入变得更容易。

命令补齐(Command-Line Completion)

通常你在 bash (或任何其他的 shell)下输入命令时你不必把命令输全 shell 就能判断出你所要输入的命令。例如,假定当前的工作目录包含以下的文件和子目录:

News/ bin/ games/ mail/ samplefile test/

如果你要进入 test 子目录,你将会输入以下的命令:

cd test

这个命令能够满足你的需要,但 bash还提供了稍微不同的方法来完成同样的事。因为 test 是当前目录里唯一以字母 t开头的子目录,bash在你只输入字母 t后就能判断出你要做什么了:

cd t

在你键入那个字母后,唯一的可能就是 test 。想让 bash 帮你结束命令的话,按下 Tab 键:

cd t

当你这样做以后,bash 将帮你补齐命令并显示在屏幕上。但在你按下回车键以前命令并没有被执行,bash 会让你检验补齐的命令是否是你真正需要的。在输入象这样短的命令时你也许看不出它的价值所在,甚至在命令很短时还会简慢输入的速度,但是当你要输入的命令有点长时,你会发现这个特性是多么的美好。

但是当目录里有不止一个以字母 t 开头的文件时会发生什么情况呢?在你使用命令补齐时会有问题,让我们看看下面的情况,当前目录里有下列内容:

News/ bin/  mail/ samplefile  test/ tools/ working/

现在这个目录里有两个以字母 t 开头的文件。假设你仍然想进入 test 子目录,如何使用命令补齐呢?如果你象先前那样键入:

cd t

bash 将不知道你到底想进入哪个子目录,因为给出的信息并不唯一。如果你这样做了的话,bash 将发出一声蜂鸣提醒你没有足够的信息来补齐你的命令。蜂鸣之后bash 并不改变输入的命令,这将使你能在原来的基础上再输入更多的信息,在这个例子中你仅需再键入一个 e 并再按一下 Tab 键,这时 bash 就有足够的信息来完成你的命令了:

cd test

当你输入命令时不论何时按下 Tab 键,bash 都将尽其所能地试图补齐命令,不行的话会发出蜂鸣来提醒你需要更多的信息。你需要键入更多的字符,并再次按下 Tab 键,重复这个过程直至你期望的命令出现。

通配符

另一个使命令输入变得更简单的方法是在命令中使用通配符。bash 支持三种通配符:

*   匹配任何字符和任何数目的字符

?   匹配任何单字符

[...] 匹配任何包含在括号里的单字符

* 通配符的使用有些象命令补齐。例如,假设当前目录包含以下文件:

News/ bin/  games/  mail/ samplefile  test/

如果你想进入 test 目录,你将键入 cd test, 或者你想用命令补齐:

cd t

现在有第三种方法来做同样的事。因为仅有一个文件以字母 t 开头,你也能用 * 通配符来进入该目录。键入下列命令:

cd t*

* 匹配任何字符和任何数目的字符,所以 shell 将把 t* 替换为 test(当前目录里唯一和通配方案匹配的文件)。当前目录里只有一个文件以字母 t 开头的话这将是可靠的。但是如果当前目录里有不止一个文件以字母 t 开头,shell 将试着进入第一个符合匹配方案的目录,这个目录是以字母表排序的第一个目录,这个目录也许是也许不是你所期望的。

通配符 * 的一个更实际的用途是通配你要执行的命令中的多个名字相似的文件。例如,假设当前目录里包含以下文件:

ch1.doc  ch2.doc  ch3.doc chimp config  mail/ test/ tools/

如果你需要打印所有扩展名是 .doc 的文件,你能使用象这样简化的命令:

lpr *.doc

在这个例子中,bash 将把 *.doc 替换为当前目录下所有文件名符合通配方案的文件。在 bash 进行了替换后,该命令将被处理为:

lpr ch1.doc ch2.doc ch3.doc

lpr 命令将以ch1.doc, ch2.doc, 和 ch3.doc为参数被调用。

--------------------------------------------------------------------------------

注意: 除了以上给出的例子外,还有几种方法:

lpr *doc

lpr *oc

lpr *c

--------------------------------------------------------------------------------

通配符 ? 除了只能匹配单个字符外,其他功能都与通配符 * 相同,如果用通配符 ? 来打印前面提到的那个目录里所有扩展名是 .doc 的文件的话,键入下面的命令:

lpr ch?.doc

通配符[...]能匹配括号中给出的字符或字符范围。同样以前面的目录为例,打印那个目录里所有扩展名是 .doc 的文件,你可以键入下列命令之一:

lpr ch[123].doc

或者:

lpr ch[1-3].doc

命令历史记录

bash 也支持命令历史记录。这意味着 bash 保留了一定数目的你先前已经在shell 里输入过的命令。这个数目取决于一个叫做HISTSIZE的变量。有关 HISTSIZE 的更多信息,请看本文后面的“bash 变量”一节。

bash 把你先前输入的命令文本保存在一个历史列表中。当你用你的帐号登录后历史列表将根据一个历史文件被初始化。历史文件的文件名被一个叫 HISTFILE 的 bash变量指定。历史文件的缺省名字是 .bash_history。这个文件通常在你的用户目录中。(注意该文件的文件名以一个句号开头,这意味着它是隐含的,仅当你带 -a 或 -A参数的 ls 命令列目录时才可见)

仅将先前的命令存在历史文件里是没有用的,所以 bash 提供了几种方法来调用它们。使用历史记录列表最简单的方法是用上方向键。按下上方向键后最后键入的命令将出现在命令行上。再按一下则倒数第二条命令会出现,以此类推。如果上翻多了的话也可以用向下的方向键来下翻。(和 DOS 实用程序doskey一样)如果需要的话,显示在命令行上的历史命令可以被编辑。

另一个使用命令历史文件的方法是用 bash 的内部命令 history 和 fc(fix 命令)命令来显示和编辑历史命令。history 命令能以两种不同的方法来调用。第一种是:

history [n]

当 history 命令没有参数时,整个历史命令列表的内容将被显示出来。下面是一个命令历史列表的例子:

1 mkdir /usr/games/pool

2 cp XpoolTable-1.2.linux.tar.z /usr/games/pool

3 cd /usr/games/pool/

4 ls

5 gunzip XpoolTable-1.2.linux.tar.z

6 tar -xf XpoolTable-1.2.linux.tar

7 ls

8 cd Xpool

9 ls

10 xinit

11 exit

12 which zip

13 zip

14 more readme

15 vi readme

16 exit

使用 n 参数的作用是仅有最后 n 个历史命令会被列出。例如,history 5 显示最后 5 个命令。

调用 history 命令的第二种方法用于修改命令历史列表文件的内容。命令的语法如下:

history [-r|w|a|n] [filename]

这种形式中,-r 选项告诉 history 命令读命令历史列表文件的内容并且把它们当作当前的命令历史列表。-w 选项将把当前的命令历史记录写入文件中并覆盖文件原来的内容。-a 选项把当前的命令历史记录追加到文件中。-n 选项将读取文件中的内容并加入到当前历史命令列表中。如果 filename 选项没有被指定,history 命令将用变量HISTFILE 的值来代替。

fc 命令能用两种方法来编辑历史命令。第一种使用下列语法:

fc [-e editor_name] [-n] [-l] [-r] [first] [last]

这里所有参数都是可选的。-e editor_name 选项用来指定用于编辑命令的文本编辑器。 first 和 last 选项用于选择列出历史命令的范围,既可以是数字也可以是字符串。-n 选项禁止列出命令的编号。-r 选项反向列出匹配的命令。-l 选项把匹配的命令行列在屏幕上(而不是在编辑器中)。如果-e editor_name参数没有被指定,则以变量FCEDIT的值来代替,如果该变量不存在的话,则用变量EDITOR的值来代替,都不存在的话将使用vi编辑器。

别名

bash 的另一个使你的工作变得轻松的方法是命令别名。命令别名通常是其他命令的缩写,用来减少键盘输入。例如,你经常要键入如下的命令,你也许会倾向于为它建立一个别名来减少工作量:

cd /usr/X11/lib/X11/fvwm/sample-configs

假如为这个长命令建立一个名为goconfig的别名,在bash提示符下键入如下命令:

alias goconfig='cd /usr/X11/lib/X11/fvwm/sample-configs'

现在,除非你退出bash,键入goconfig将和原来的长命令有同样的作用。如果想取消别名,可以使用下面的命令:

unalias goconfig

这是一些很多用户认为有用的别名,你可以把它们写入你的.profile文件中提高工作效:

alias ll='ls -l'

alias log='logout'

alias ls='ls -F'

如果你是一名DOS用户并且习惯了DOS命令,你能下面的别名定义使你的 Linux 表现得象DOS 一样:

alias dir='ls'

alias copy='cp'

alias rename='mv'

alias md='mkdir'

alias rd='rmdir'

--------------------------------------------------------------------------------

注意: 在定义别名时,等号的两头不能有空格,否则 shell 不能决定你需要做      什么。仅在你的命令中包含有空格或特殊字符时才需要引号。

--------------------------------------------------------------------------------

如果你键入不带任何参数的alias命令,将显示所有已定义的别名,例如:

alias dir='ls'

alias ll='ls -l'

alias ls='ls -F'

alias md='mkdir'

alias net='term < /dev/modem > /dev/modem 2> /dev/null&'

alias rd='rmdir'

输入重定向

输入重定向用于改变一个命令的输入源。一些命令需要在命令行里输入足够的信息才能工作。比如 rm,你必须在命令行里告诉 rm 它你要删除的文件。另一些命令则需要更详细的输入,这些命令的输入可能是一个文件。比如命令 wc 统计输入给它的文件里的文件里的字符数,单词数和行数。如果你仅在命令行上键入 wc ,wc 将等待你告诉它要统计什么,这时 bash 就好象死了一样,你键入的每样东西都出现在屏幕上,但什么事也不会发生。这是因为 wc 命令正在为自己收集输入。如果你按下Ctrl-D,wc 命令的结果将被写在屏幕上。如果你输入一个文件名做参数,象下面的例子一样,wc 将返回文件所包含的字符数,单词数,和行数:

wc test

11 2 1

另一种把test文件内容传给 wc 命令的方法是重定向 wc 的输入。 < 符号在bash里用于把当前命令的输入重定向为指定的文件。所以可以用下面的命令来把 wc 命令的输入重定向为 test 文件:

wc < test

11 2 1

输入重定向并不经常使用因为大多数命令都以参数的形式在命令行上指定输入文件的文件名。尽管如此,当你使用一个不接受文件名为输入参数的命令,而需要的输入又是在一个已存在的文件里时,你就能用输入重定向解决问题。

输出重定向

输出重定向比输入重定向更常用。输出重定向使你能把一个命令的输出重定向到一个文件里,而不是显示在屏幕上。

很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,你能把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件;当你想保存一个命令的输出时也可以使用这种方法。还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入时。(还有一种更简单的方法可以把一个命令的输出当作另一个命令的输入,就是使用管道,管道的使用将在本文的“管道”一节介绍)

输出重定向的使用与输入重定向很相似,但是输出重定向的符号是 > 。

--------------------------------------------------------------------------------

注意:记忆输入/输出重定向符号的最好方法是把 <看作是一个漏斗,漏斗的小口      指向需要输入的命令(因为需要接受输入的命令会在 <的左手边),而把>      当作一个大口指向有输出的命令的漏斗。

--------------------------------------------------------------------------------

重定向举例,当你要把 ls 命令的输出保存为一个名为 directory.out 的文件时,你可以使用下面的命令:

ls > directory.out

管道

管道可以把一系列命令连接起来。这意味着第一个命令的输出会通过管道传给第二个命令而作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,以此类推。而管道行中最后一个命令的输出才会显示在屏幕上(如果命令行里使用了输出重定向的话,将会放进一个文件里)。

你能通过使用管道符 | 来建立一个管道行,下面的示例就是一个管道行:

cat sample.text | grep "High" | wc -l

这个管道将把 cat 命令(列出一个文件的内容)的输出送给grep命令。grep 命令在输入里查找单词 High,grep命令的输出则是所有包含单词 High的行,这个输出又被送给 wc命令。带 -l选项的 wc命令将统计输入里的行数。假设 sample.txt的内容如下:

Things to do today:

Low: Go grocery shopping

High: Return movie

High: Clear level 3 in Alien vs. Predator

Medium: Pick up clothes from dry cleaner

管道行将返回结果 2,指出你今天有两件很重要的事要做:

cat sample.text | grep "High" | wc -l

2

提示符

bash 有两级用户提示符。第一级是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$(如果是超级用户,则是#号)。你可以通过改变bash 的PS1变量的值来改变你的缺省提示符,例如:

PS1="Please enter a command"

把bash shell 的提示符该为指定的字符串。

当bash 期待输入更多的信息以完成命令时显示第二级提示符。缺省的第二级提示符是 >。 果你要改变第二级提示符,可以通过设置PS2变量的值来实现:

PS2="I need more information"

另外你还可以用特殊的字符来定义你的提示符,下面的列表列出了最常用的特殊字符。

提示符特殊字符代码

字符   含义

\!    显示该命令的历史记录编号。

\#    显示当前命令的命令编号。

\$    显示$符作为提示符,如果用户是root的话,则显示#号。

\\    显示反斜杠。

\d    显示当前日期。

\h    显示主机名。

\n    打印新行。

\nnn   显示nnn的八进制值。

\s    显示当前运行的shell的名字。

\t    显示当前时间。

\u    显示当前用户的用户名。

\W    显示当前工作目录的名字。

\w    显示当前工作目录的路径。

这些特殊字符能组合成很多种有用的提示符方案(也可以组合为很奇异的方案),例如把 PS1 设为:

PS1="\t"

这导致提示符显示当前的时间,就象下面的显示一样(提示符后面将不会有空格):

02:16:15

而下面的设置:

PS1=\t

将导致提示符变成下面的样子:

t

这显示了设置中引号的重要性,下面的提示符串:

PS1="\t\\ "

会使提示符看起来象这个样子:

02:16:30

这种情况下,提示符后面会有一个空格,因为引号里有一个空格。

作业控制(Job Control)

作业控制能够控制当前正在运行的进程的行为。特别地,你能把一个正在运行的进程挂起,稍后再恢复它的运行。bash 保持对所有已启动的进程的跟踪,你能在一个正在运行的进程的生命期内的任何时候把它挂起或是使它恢复运行。

按下 Ctrl-Z 使一个运行的进程挂起。bg 命令使一个被挂起的进程在后台恢复运行,反之 fg 命令使进程在前台恢复运行。这几个命令在当用户想在后台运行而意外的把它放到了前台时,经常被用到。当一个命令在前台被运行时,它会禁止用户与 shell 的交互,直到该命令结束。这通常不会造成麻烦,因为大多数命令很快就执行完了。如果你要运行的命令要花费很长的时间的话,我们通常会把它放到后台,以使我们能在前台继续输入其他命令。例如,你输入这个命令:

command find / -name "test" > find.out

它将寻找整个文件系统中的名为test 的文件并把结果保存在一个叫fing.out的文件里。如果在前台运行的话,根据文件系统的大小,你的shell将有数秒甚至数分钟不能使用,你不想这样的话可以再输入以下面的内容:

control-z

bg

find 命令首先被挂起,再在后台继续被执行,并且你能马上回到bash下。

用户化配置bash

本文已经描述了许多用户化配置bash的方法。但知道现在为止,我们所做的改动都仅在当前运行的bash下才有效。一旦退出系统,所有的改动也随之消失了。为了保存这些用户化配置,你必须把它们保存到一个bash的初始化文件里。

你能把任何想每次进入cash都执行的命令放到初始化文件里。这个文件里最常见到的命令通常是alias和变量的初始化。bash的初始化文件叫做 profile。每个使用bash的用户都有一个 .profile文件在他的用户目录里。bash在每次启动时都读取这个文件,并执行所有包含的命令。

下面的代码是缺省的.profile文件的内容。这个文件的位置在 /etc目录。如果你想设置自己的bash 的话把它拷到你的用户目录里(如果还没有的话)并命名为.profile。

--------------------------------------------------------------------------------

注意: 有些setup程序会在建立用户时自动放一个.profile文件的拷贝在你的用      户目录里。但是并不是所有的都这么做,所以最好先检查一下你的用户目      录。记住所有以句点开头的文件都是隐含的,只有用ls -a或ls -A命令才      能列出。

--------------------------------------------------------------------------------

# commands common to all logins

export OPENWINHOME=/usr/openwin

export MINICOM="-c on"

export MANPATH=/usr/local/man:/usr/man/preformat:/usr/man:/X11/man:/usr/openwin /m

an

export HOSTNAME="`cat /etc/HOSTNAME`"

PATH="$PATH:/usr/X11/bin:$OPENWINHOME/bin:/usr/games:."

LESS=-MM

# I had problems using 'eval test' instead of 'TERM=', but you might want to # try

it anyway. I think with the right /etc/termcap it would work great. # eval 'tset

-sQ "$TERM"'if [ "$TERM" = "" -o "$TERM" =

"unknown"]; then

TERM=linux

#PS1=''hostname':'pwd'# `

if [ "$SHELL" = "/bin/pdksh" -o "$SHELL" = "/bin/ksh" ]; then

PS1="! $"

elif [ "$SHELL" = "/bin/zsh" ]; then

PS1="%m:%~%# "

elif [ "$SHELL" = "/bin/ash" ]; then

PS1="$ "

else

PS1='\h:\w\$ `

fi

PS2='> `

ignoreeof=10

export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof

umask 022

# set up the color-ls environment variables:

if [ "$SHELL" = "/bin/zsh" l; then

eval 'dircolors -z'

elif [ "$SHELL" = "/bin/ash" l; then

eval 'dircolors -s'

else

eval 'dircolors -b'

fi

echo

fortune

echo

export TAPE="/dev/nftape"

bash 命令概要

这是几个最有用的bash内部命令:

alias: 设置bash别名。

bg:   使一个被挂起的进程在后台继续执行。

cd:   改变当前工作目录。

exit:  终止shell。

export: 使变量的值对当前shell的所有子进程都可见 。

fc:   用来编辑历史命令列表里的命令。

fg:   使一个被挂起的进程在前台继续执行。

help:  显示bash内部命令的帮助信息。

kill:  终止某个进程。

pwd:  显示当前工作目录。

unalias: 删除已定义的别名。

bash 还有许多命令,但这些是最常用的,想了解更详细的情况,请参考bash的手册--在提示符下键入 man bash。

bash 变量

这里是几个最有用的bash变量,包括变量名和简单描述。

EDITOR, FCEDIT: bsah fc 命令的缺省编辑器。

HISTFILE: 用于贮存历史命令的文件。

HISTSIZE: 历史命令列表的大小。

HOME: 当前用户的用户目录。

OLDPWD: 前一个工作目录。

PATH: bash寻找可执行文件的搜索路径。

PS1: 命令行的一级提示符。

PS2: 命令行的二级提示符。

PWD: 当前工作目录。

SECONDS: 当前shell开始后所流逝的秒数。

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

116楼 旧帖 06-07-17 23:32

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

Bash最常见的激活模式

Bash最常见的激活模式是交互式和非交互式:

1.交互式激活

指其标准输入和输出都连接在终端上.又分为三种类型:login,非login,posix 以及受限的shell.

确定一个shell是否是交互式的可以通过检测$PS1环境变量.

(1) 当Bash作为login shell被激活时,它将依次读取并执行以下文件:

/etc/profile,~/.bash_profile,~/.bash_login,~/.profile

使用--noprofile选项激活Bash可以禁止其读任何初始化文件 在退出时执行 ~/.bash_logout 文件

(2) 当Bash作为非login shell被激活时,它将读取并执行~/.bashrc

使用--norc选项激活Bash可以禁止执行任何初始化文件,使用 --rcfile file可以指定执行的初始化文件.

(3) 当Bash作为posix模式被激活时,它将先检查$ENV变量是否定义.

若定义,Bash读取并执行有$ENV变量扩展而得到的文件,否则不再 执行任何初始化文件。

(4) 当Bash作为受限模式被激活时,它除了禁止某些操作以外,其他行为于其他模式相同.受限操作有:改变目录,修改$SHELL和$PATH变量, 运行exec,以绝对路径运行程序以及使用重定向.Bash 1.x中不包含 受限模式.

2.非交互式激活

主要用来运行Shell脚本.启动后,Bash检查$BASH_ENV变量,若定义, 这执行该变量指定文件中包含的命令.

Bash 的激活选项

-c string 该选项表明string中包含了一条命令.如 bash -c ls ~

-i 使Bash以交互式方式运行

-r 使Bash以受限方式运行

--login 使Bash以登录Shell方式运行

--posix 使Bash遵循POSIX标准

--verbose 使Bash显示所有其读入的输入行

--help 打印Bash的使用信息

--version 打印版本信息

--noprofile

--norc

--rcfile file

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

117楼 旧帖 06-07-17 23:33

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

Linux Shell 里一些很少用到?很有用的指令

  有个叫 80/20 法则的观念可以联想到软件系统上,观查发现, 80% 的使用者族群,固定会去使用的只有 20% 的系统功能。不需要去大费周章的证实这样的统计值,我二十年以上建立软件架构及使用软件系统的经验告诉我,这样的假定,极有可能是正确的。一堆的 Linux 命令列程序皆无一例外于这样的普遍现象。 Linux 提供许多 Shell 层级的命令,可能只有十个能普遍被了解并使用之,而剩下的极大部份,几乎是被忽略的。

  这些在 Linux Shell 里不起眼的小东西有哪些是具有被提出来讨论的价值的呢? 我在这将简短的介绍几个不常用,但却相当好用的 Linux Shell 命令,这些程序是我用了好几年,经得起时间考验的。特别是,我选择将重点放在语法解析及格式化文字内容的命令上。

  在这些例子里,我假定大家对命令列的语法有基本的熟悉度,并具简单的 Shell 概念还有一些并不是那么普遍的Linux命令。即使如此,命令列的范例仍附上适当的批注而且它是很直接的。在每一个应用上,各个命令列的执行底下都会有一个使用范例给大家看。

  下列便是这些语法、格式及文字内容的展现,虽然并非每个范例皆提供具体的说明,不过必须知道的一点是,下列命令若是没有指定档案参数,则它会读取标准输入。

  Head/Tail

  head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾?~,看看下面的范例:

  ## (1) displays the first 6 lines of a file

  head -6 readme.txt

  ## (2) displays the last 25 lines of a file

  tail -25 mail.txt

  范例一是显示档案的前 6 行,范例二则是显示档案最后的 25 行。

  而下面的范别,结合了 head 与 tail 的指令,显示档案的第 11 行到第 20 行:

  # (3)

  head -20 file | tail -10

  在 tail 的使用手册页中显示了比 head 还多的可用参数,其中有一个很好用的参数 " -f ",使用此参数时,tail 不会回传结束信号,除非我们去自行去中断它;相反的,它会一直等待一段时间,一直到他发现资料自它最后一次被读取后,又被加入新的一行时:

  ## (4) display ongoing updates to the given

  ## log file

  tail -f /usr/tmp/logs/daemon_log.txt

  上述范例可以动态显示该 log 文件的动态更新。

  假设该服务程序是一直不断的加入动态资料到 /usr/adm/logs/daemon_log.txt 的 log 文件里,在命令列控制窗口中使用 tail -f,它将会以一定的时间实时追踪该档的所有更新。 ( -f 的只有在其输入为档案时才能使用 )。

  假如你在 tail 后下了多个档案参数,你便能在同一个窗口内一次追踪数个 log ?:

  ## track the mail log and the server error log

  ## at the same time.

  tail -f /var/log/mail.log /var/log/apache/error_log

  tac -- 反过来串连?!

  cat 倒过来怎么拼 ? 对啦 !! 这就是 tac 的功能? ~ 它是把档案的顺序内容反过来串连用的,那么 ~ 它都用在什么状况下呢 ? 任何须要以后进先出的顺序重新排列组件的工作都用得上它 ! 以下面的指令来说,便是以自最后建立的到最先建立的顺序,列出三个最新建的使用者帐号:

  # (5) last 3 /etc/passwd records - in reverse

  $ tail -3 /etc/passwd | tac

  curly:x:1003:100:3rd Stooge:/homes/curly:/bin/ksh

  larry:x:1002:100:2nd Stooge:/homes/larry:/bin/ksh

  moe:x:1001:100:1st Stooge:/homes/moe:/bin/ksh

  nl -- 为输出列加上编号

  nl 是一个简单但很好用的编号过滤工具,我在输入的地方下了参数,让所有行列的编码皆靠左,nl 是供了非常多的参数使用,可以定义到很细很细的程序来制定它下好编号的输出,下面是一些参数使用的范例说明:

  # (6) Display the first 4 entries of the password

  # file - numbers to be three columns wide and

  # padded by zeros.

  $ head -4 /etc/passwd | nl -nrz -w3

  001 root:x:0:1:Super-User:/:/bin/ksh

  002 daemon:x:1:1::/:

  003 bin:x:2:2::/usr/bin:

  004 sys:x:3:3::/:

  #

  # (7) Prepend ordered line numbers followed by an

  # ’=’ sign to each line -- start at 101.

  $ nl -s= -v101 Data.txt

  101=1st Line ...

  102=2nd Line ...

  103=3rd Line ...

  104=4th Line ...

  105=5th Line ...

  .......

  fmt -- 格式化

  fmt 是一个简单的文字格式化工具,它重点是在让文字的资料与最大所能支持的宽度一致,它是利用结合及截断行列的空白所完成的。前提是你需要维护的是一个由文书处理器所产生的文字内容,它所输出的文字可能含括了各种不同长度的行列,若这样的文字是由文字编辑器 ( 像是 vi ) 作的,fmt 便能够将此原始文字转化成更好维护的格式。下面的第一个例子,显示的是下 fmt 指令来重新制作档案格式,让它一行不要超过 80 个字符:

  # (8) No more than 60 char lines

  $ fmt -w 60 README.txt > NEW_README.txt

  #

  # (9) Force uniform spacing:

  # 1 space between words, 2 between sentences

  $ echo "Hello World. Hello Universe." |

  fmt -u -w80

  Hello World. Hello Universe.

  fold -- 将输入分段

  fold 跟 fmt 很像,但他通常是用来格式化与非增加文字可读性的资料,下面有个简单的例子:

  # (10) Format text in 3 column width lines

  $ echo oxoxoxoxo | fold -w3

  oxo

  xox

  oxo

  # (11) Parse by triplet-char strings -

  # search for ’xox’

  $ echo oxoxoxoxo | fold -w3 | grep "xox"

  xox

  # (12) One way to iterate through a string of chars

  $ for i in $(echo 12345 | fold -w1)

  > do

  > ### perform some task ...

  > print $i

  > done

  1

  2

  3

  4

  5

  tr

  tr 为一个简单的字组转换器,它的实际应用与一些较复杂的程序有点重复,像是 sed 和 awk [ 更大型的二进制程序代码 ]。tr 在文字的置换、删从及增加上很好用。它的指令模式是 " 从 ( 放在第一个参数 ) …到 ( 第二个参数 )… " 的模式;下面为它一般的使用语法:

  # (13) tr usage

  tr [options] "set1" ["set2"]

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

118楼 旧帖 06-07-17 23:33

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

Linux 基本使用命令(基本篇)

现在请输入你的用户名和密码,当然,我们输入root,这样获得一切管理权限!

你一定非常希望立刻看到那些非常漂亮的图形界面,但是也许我要让你失望了。我建议在没有使用图形界面以前,首先熟练的掌握基本的Linux命令,这样才是一个真正的Linuxer。从哪里开始呢?

1. ls 列出文件和目录的命令

你一定很想知道你的电脑里面有哪些东西,现在执行命令ls,啊,怎么什么都没有?当然啦,这是你第一次登录到这个系统,你的默认位置是你的个人目录,而不是系统根目录。你还没有在这个目录里面存放任何的个人文件,当然什么都没有啦。如果你是用root用户登录的话,你的个人目录就是/root目录;如果你是用普通用户登录,比如叫做kris,那么kris的个人目录是/kris。前面的/是什么意思呢?就是“根”的意思,就是最前面的那个目录,在根目录下面建立有很多的子目录,我们在第一章已经讨论过了。

ls命令有很多的选项,常用的是:

-A 选项用来列出所有的文件,包括那些隐藏的文件。为什么我们要隐藏文件呢?道理和你为什么要把情书藏起来不让爸妈发现是一样的。就是为了保密啊。现在执行ls -A看看?是不是有一个隐藏文件“.bashrc”被显示出来啦?聪明的你一定奇怪的发现这个文件名前面有一个点,对!记住,只要文件名前面第一个字符是一个“.”,这个文件就是隐藏文件。一个目录名前面的第一个字符如果是“.”这个目录就是隐藏目录。

-l 这个选项用来显示一个列表,包含了这个目录下面所有的文件的绝大部分属性的列表。你可以每个文件的大小,所有者,你的权限还有修改日期等等。

-R R的意思就是recursive递归,明显这个选项让系统显示出这个目录下面的所有文件以外,还要显示出所有子目录下面的文件。也就是把我们那一大堆水果全部抖出来。

--color 这个选项特别有用,我估计大家的显示器都是彩显吧,什么?你的显示器还是黑白的?天哪!既然是彩显,那么我们可以让ls命令用不同的眼色代表不同的文件类型。比如可执行文件用绿色,普通文件是白色,目录是蓝色。也许你会问,目录也是文件吗?对的,在Linux里面一切都是文件,所有的硬件设备都用一个文件来代替,比如你的软驱,就是用/dev/fd0来代替的。目录也是一个文件。

--help 这个选项几乎是每一个Linux命令都有的,用来显示出该命令的帮助信息。

2. cd 和 mkdir 以及 rm 改变当然所在目录,建立新目录以及删除目录命令

趁热打铁的,刚才说了目录,我们每一次登录都有一个默认目录就是我们的个人用户目录。我们怎么才能到其他的目录去呢?cd就是用来改变当前所在的目录的。前面我们说过,“/”代表根目录,那么执行cd /就可以进入根目录。不试一下吗?

让我们看看根目录下面有哪些文件和子目录吧,执行ls,我们发现,根目录下面有一个目录名子特别变态,叫做usr,进去看看,cd usr,看看这里面有什么?你会发现一个更psycho(变态)的目录叫做src,进入src目录看看?没什么好玩的。那么我们现在回到刚才的usr目录,怎么做?是不是cd usr?执行试一下,好像不行,系统报告出错 cd: usr: No such file or directory。这是怎么搞的?问题在于我们现在所在的目录是/usr/src下,我们执行cd usr的意思是进入/usr/src/usr目录而不是/usr目录。正确的方法是cd /usr。

就好比你在中华美食的箩筐里面看到一个四川的箩筐,里面有一个成都的小箩筐,现在你进入以后发现成都的小箩筐里面有一种叫做“麻辣烫”的很辣的食品。你大饱口福以后想要吃一些甜点,于是准备去福州。你能站在成都的箩筐里面去福州吗?当然不行,福州并不在成都的箩筐里面啊,你应该进入“/中华美食/福州”而不是“/中华美食/四川/成都/福州”对不对?

好的,一个问题出现了,难道我每一次进入一个目录,都要用/usr/src...这么复杂的方式来表示吗?不一定。我们用“..”的方式来表示上一层目录。如果你现在在/usr/src目录下,进入/usr目录有两种办法:cd /usr和cd ..他们是一样的。

怎样才能知道我现在在哪个目录?用命令pwd,这个命令没有什么好说的,执行一次就知道了。

现在我想在我自己的个人目录里面建立一个目录叫做LoveLetter。我应该首先回到我自己的目录,这里有一个简单的方法,就是直接运行cd不带任何参数,这样就可以回到自己的目录,当然也可以cd /root或者cd /home/kris,看你是用什么用户登录的。

进入我自己的目录以后,建立新目录的命令是

mkdir 新目录名

我执行 mkdir LoveLetter 就可以建立一个新的叫做LoveLetter的目录。进入这个目录看看?什么都没有。不着急,慢慢来。我都不着急你急什么?

突然我想起这台电脑我的爸妈也要使用,他们看到我的情书目录怎么办?你忘了刚才我说的可以用加一个点“.”在前面的方法来隐藏目录和文件的?我们可以改变这个目录的名字,但是这个命令我准备等会儿讲,现在我们用一个很无聊的办法来完成这个要求。这个办法就是删掉刚才建立的oveLetter目录在新建一个.LoveLetter目录,之所以说这个办法很无聊,是因为我们现在是在做实验,如果来真的,你原意删掉你的情书吗?是不是另有新欢啦?哈哈。

删除目录的命令其实也可以删除文件,就是rm。

rm 待删除的文件名/目录名

我记得Redhat会提示你是不是真的要删除。按y就是确定,按n就是取消。如果Redhat没有提示你,那么等会请根据我说的方法修改一下系统让它提示咱们。免得以后心痛。删除一个文件很简单。麻烦的是删除一个目录,如果一个目录里面已经有文件,rm是不让直接删除的,你必需先把目录里面的所有文件删除,再删除目录。但是有一个参数可以改变一下,就是 -rf ,这个参数有一定的危险性,因为即使系统本来要提醒一下是不是真的删除目录,加上这个参数也不会有提示了。执行rm 目录 -rf会在一眨眼的时间里面让你的资料下课!

那么我现在就删除LoveLetter目录了:rm LoveLetter -rf

建立一个新的目录mkdir .LoveLetter

现在ls看看,是不是看不到LoveLetter目录了?但是ls -A还是能看到的。所以这种隐藏方式只能偏偏自己,真正让你的文件安全的方式还是以后再讲吧。

3. mv 改变文件名和目录名的命令

cp 复制文件和目录命令

man 命令使用方法参考工具

mv 老文件名 新文件名

mv 老目录名 新目录名

就可以改变文件或者目录的名字。

我现在想要把刚才的这个目录.LoveLetter改名回去,因为这种无聊的隐藏方式很变态,我们有更高级的方法来做这样一件事情:就是不要告诉爸妈你的密码!!!

mv .LoveLetter LoveLetter

cp命令用来把一个文件复制成为一个新的文件,

cp 老文件名 新文件名

这个老文件明和新文件名如果在同一个目录下面,那么当然需要名字不一样,很简单的道理,如果文件名一样何必建立两个文件?如果新老文件在不同的目录,我们就可以让它们有相同的名子。下面的例子说明了这一点:

cp LoveLetter LoveLetter_yesterday 新的文件LoveLetter_yesterday和旧的LoveLetter在同一个目录,所以名子不一样。

cp LoveLetter /home/LoveLetter 新的文件在/home目录下面,但是旧的文件LoveLetter在某一个用户的个人目录下面,当然两者名子可以相同。

cp命令也可以复制整个目录,但是现在我们暂时不讲这么复杂。其实cp还有rm以及ls这些命令不仅是整个Linux的基本命令,更包含了非常多的功能。如果大家有兴趣,可以使用man

man 命令名字

比如man ls,这样就可以看到所有ls命令和参数的详悉解释,尤其是一部分常用的命令的man帮助已经由志愿者翻译了,大家看起来更容易。

一点幽默

好了,说了好多东西了,我想休息一下,给大家说一个有趣的事情,我们说了好多命令和目录的名子,你们是不是觉得有点奇怪。说实在话,我第一次看到usr这个目录时也不知道是什么意思,后来才发现以下对应关系:

usr -> user

ls -> list

mkdir -> make dir

rm -> remove

src -> source

mv -> move

cp -> copy

是不是很有趣,在UNIX世界,包括Linux世界,人们的想象力就是这么无敌!简写居然能简写成这样子。大家一般的想法是取一个单词的前三个或者前四个字母作为简写,可是UNIX的牛人就是喜欢把move简写成为mv,真不知道他们怎么想的。大家一起捉摸吧

4. nano 和 vi编辑文件的命令 和 cat 以及 more显示文本文件

nano是一个小巧自由,并且友好的编辑器,我认为nano更适合初学Linux的朋友使用。我们现在只学习怎样编辑一个文件以及怎样保存。

nano 文件名

如果你写的文件名已经存在,那么就打开并且编辑,否则就建立一个新的文件。编辑的方法还用说吗?呵呵,当你想要退出的时候,按ctrl+x,nano会问你是不是保存编辑的文件。按Y就是保存,按N就不保存。

nano最大好处在于用户可以不用记忆太多的操作键,大部分常用的功能的操作方法都在屏幕下放列出了。新手需要注意的是“^X”就是按住ctrl键不放再按X的意思。

下面简单的介绍vi。vi是一个非常强大的编辑软件。它太庞大了,足够写一本书专门来讲解。我们这里从使用的角度出发,讲一下vi的用法。

vi有两种模式,一种是命令模式,一种是编辑模式。进入vi以后,默认处于命令模式。

现在我们执行vi LoveLetter。进入以后,按一下键盘上的Insert功能键或者i键可以进入编辑状态,可以插入字符,再按一下Insert变成复盖模式,这两种模式的区别很容易体现,大家尝试一下就可以了。上下左右四个方向键可以移动光标。基本的编辑命令和Windows里面没有区别。是不是很容易呢?当你把需要的内容输入完成以后,我们要保存,这时候按一下ESC键从编辑模式回到命令模式,首先输入一个冒号“:”,也就是按住SHIFT键不放再按分号“;”这样首先输入一个“:”,然后,输入w,回车,就可以保存我们编辑的内容到LoveLetter文件。现在我们按一下Insert就可以继续编辑。再按ESC,输入“:”,再按w又可以保存。可是现在我们不需要保存,我们想要不保存就退出,怎么做呢?当我们输入w的时候是write的意思,保存,那么我们输入q就是quit退出的意思。好,输入q,回车,vi提示我们刚才进行的修改还没有保存,所以记住!一旦需要放弃我们的修改,不能直接用q命令退出,而需要用“q!”命令。输入q!,好了,退出了。

我们想看看我们刚才编辑的LoveLetter是不是真的保存好了,再vi LoveLetter,ok,看到了吧?现在我们想要直接退出,就可以只输入“:q”就可以了,不用输入那个“!”因为我们没有修改文件内容。如果我们修改一下这篇文章,我们在退出的时候可以输入“ESC : wq”就可以了。不需要把w和q分成两次输入。

vi的最最基本用法说到这里差不多了,要是你还想多了解一些vi的知识,在进入vi以后直接按F1就可以了,有详悉的帮助和教学。

其实刚才我们想要看一下编辑的LoveLetter是不是保存好了,不用再vi进去的,只需要用命令

cat LoveLetter

就可以了。cat就是用来显示文本文件内容的命令。如果我们的文本文件很长,一个屏幕显示不完,cat是不会自动分页的。我们可以换用命令

more LoveLetter

more命令显示文本文件时,如果内容过多,会自动的在每一页结束时暂停下来,等到用户按一下空格键再继续。

5. 最重要的命令:halt reboot 关机和重新启动命令

在Linux里面,不能够直接用电源按钮关机,也不能直接用reset按钮重新启动,这对系统,尤其是硬盘有比较大的影响。关机命令是halt,重启动命令是reboot。其实还有shutdown命令完成类似功能,需要的话,请用今天学会的man命令学习使用。

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

119楼 旧帖 06-07-17 23:33

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

Linux 文件内容统计命令

wc命令

   wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。

   语法:wc [选项] 文件…

   说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。

   该命令各选项含义如下:

   - c 统计字节数。

   - l 统计行数。

   - w 统计字数。

   这些选项可以组合使用。

   输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。

   行数、字数、字节数、文件名

   如果命令行中没有文件名,则输出中不出现文件名。

   例如:

   $ wc - lcw file1 file2

   4 33 file1

   7 52 file2

   11 11 85 total

   省略任选项-lcw,wc命令的执行结果与上面一样。

   文件比较命令 

   这组命令可以用来比较两个文件内容的差别。

   Comm命令

   如果想对两个有序的文件进行比较,可以使用comm命令。

   语法:comm [- 123 ] file1 file2

   说明:该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件,然后生成三列输出:仅在file1中出现的行;仅在file2中出现的行;在两个文件中都存在的行。如果文件名用“- ”,则表示从标准输入读取。

   选项1、2或3抑制相应的列显示。例如comm - 12就只显示在两个文件中都存在的行;comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行;comm - 123则什么也不显示。

   例如:假设要对文件myfile1和myfile2进行比较

  

 

QUOTE:

$ cat myfile1

   main( )

   {

   float a,b, i, j ,z ;

   a=i=10 ; b=j=5 ;

   z= i + j ;

   printf(“z=%d\n”,z) ;

   }

   $ cat myfile2

   #include

   main( )

   {

   float i, j ,z ;

   i=10 ; j=5 ;

   z= i + j ;

   printf(“z=%f\n”,z) ;

   }

   $ comm - 12 myfile1 myfile2

   main( )

   {

   z= i + j ;

   }

   就只显示文件myfile1和myfile2中共有的行。

   Diff命令

   该命令的功能为逐行比较两个文本文件,列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

   语法:diff [选项] file1 file2

   说明:该命令告诉用户,为了使两个文件file1和file2一致,需要修改它们的哪些行。如果用“- ”表示file1或fiie2,则表示标准输入。如果file1或file2是目录,那么diff将使用该目录中的同名文件进行比较。例如:

   diff /usr/xu mine

   把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。

   通常输出由下述形式的行组成:

   n1 a n3,n4

   n1,n2 d n3

   n1,n2 c n3,n4

   这些行类似ed命令把filel转换成file2。字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)是针对file2的。字母a、d和c分别表示附加、删除和修改操作。

   在上述形式的每一行的后面跟随受到影响的若干行,以“<”打头的行属于第一个文件,以“>”打头的行属于第二个文件。

   diff能区别块和字符设备文件以及FIFO(管道文件),不会把它们与普通文件进行比较。

   如果file1和file2都是目录,则diff会产生很多信息。如果一个目录中只有一个文件,则产生一条信息,指出该目录路径名和其中的文件名。

   diff各选项的含义如下:

   - b 忽略行尾的空格,而字符串中的一个或多个空格符都视为相等。如How are you与How are you被视为相同的字符串。

   - c 采用上下文输出格式(提供三行上下文)。

   - C n 采用上下文输出格式(提供n行上下文)。

   - e 产生一个合法的ed脚本作为输出。

   - r 当file1和file2是目录时,递归作用到各文件和目录上。

   例如,文件ml.c的内容为(左边行号是有意加上的,以便前后对照):

   1 main( )

   {

   printf(“Hello!\n”);

   }

   5

   文件m2.c的内容为:

   1 main()

   2 {

   3 int n , m ;

   4 n= 10 ;

   5 printf ( “ % d \ n ” , m = n * 10);

   6 }

   输入命令:

   $ diff m1.c m2.c

   屏幕上显示:

   3,5 c 3,6

   printf(“Hello!\n”);

   }

   <5

   >3 int n,m;

   >4 n=10 ;

   >5 printf ( “ % d \ n ” , m = n * 10);

   >6 }

   表示把文件m1.c的3至5行改成m2.c的3至6行后,两个文件相同。 本文由TurboLinux公司提供。

阅读(1680) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~