Unix命令。

以下只说明各指令的基本用法, 若需详细说明, 请用 man 去读详细的 manual.

a. 关於档案/目录处理的指令:

1. ls
这是最基本的档案指令。 ls 的意义为 "list",也就是将某一个目录或是
某一个档案的内容显示出来。

如果你在下 ls 指令後头没有跟著任何的档名,它将会显示出目前目录中所
有档案。

也可以在 ls 後面加上所要察看的目录名称或档案的名称,如

% ls /home2/X11R5

% ls first

ls 有一些特别的参数,可以给予使用者更多有关的资讯,如下:

-a : UNIX 中若一个目录或档案名字的第一个字元为 "." , 则使用 ls
将不会显示出这个档案的名字,我们称此类档案为隐藏档。如 tcsh
的初设档 .tcshrc;如果我们要察看这类档案,则必须加上参数 -a

-l : 这个参数代表使用 ls 的长( long )格式,可以显示更多的资讯,
如档案存取权,档案拥有者( owner ),档案大小,档案最後更新
日期,甚而 symbolic link 的档案是 link 那一个档等等。如下

% ls -l

drwx--x--x 2 jjtseng 512 Aug 8 058 18
drwx--x--x 2 jjtseng 512 Aug 8 220 19
-rw------- 1 jjtseng 566 Aug 8 05:28 makefile

2. cp
cp 这个指令的意义是复制("COPY") , 也就是将一个或多个档案复制成另
一个档案或者是将其复制到另一个目录去。

cp 的用法如下:

cp f1 f2 : 将档名为 f1 的档案复制一份为档名为 f2 的档案。
cp f1 f2 f3 ... dir : 将档案 f1 f2 f3 ... 都以相同的档名复制一
份放到目录 dir 里面。
cp -r dir1 dir2 : dir1 的全部内容全部复制到 dir2 里面。

cp 也有一些参数,如下:

-i : 此参数是当已有档名为 f2 的档案时,若迳自使用 cp 将会将原来 f2
的内容掩盖过去,因此在要盖过之前必须先询问使用者一下。如使用者
的回答是y(yes)才执行复制的动作。

-r : 此参数是用来做递回复制用,可将一整颗子树都复制到另一个
目录中。

3. mv
mv 的意义为 move , 主要是将一档案改名或换至另一个目录。如同 cp ,它也有
三种格式:

mv f1 f2 : 将档名为 f1 的档案变更成档名为 f2 的档案。
mv dir1 dir2 : 将档名为 dir1 的目录变更成档名为 dir2 的目录。
mv f1 f2 f3 ... dir : 将档案 f1 f2 f3 ... 都移至目录 dir 里面。

mv 的参数有两个,-f -i , 其中 -i 的意义与 cp 中的相同,均是 interactive
询问之意。而 -f 为强迫( force ) , 就是不管有没有同名的档案,反正我就是要
搬过去,所有其他的参数遇到 -f 均会失效。

4. rm
rm 的意义是 remove ,也就是用来杀掉一个档案的指令。在 UNIX 中一
个被杀掉的档案除非是系统恰好有做备份,否则是无法像 DOS 里面一样还能够救回
来的。所以在做 rm 动作的时候使用者应该要特别小心。

rm 的格式如下:

rm f1 f2 f3 .....

rm 的参数比较常用的有几个: -f , -i , -r

-f : 将会使得系统在删除时,不提出任何警告讯息。
-i : 在除去档案之前均会询问是否真要除去。
-r : 递回式的删除。

小心不要随便使用 rm -rf , 否则有一天你会"欲哭无泪"......

5. mkdir
mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用
midir 建立一个子目录,使用的方法如下:

mkdir dirname1 [ dirname2 ... ]

如此你就可以建立一个或多个目录。

6. chdir ( cd )
这是让使用者用来转移工作目录用的。
chdir 的用法如下:

chdir dirname

如此你就可以将目前的目录转移到 dirname 这一个目录去。
或使用 "chdir .." 来转移到上一层目录。

7. rmdir
相对於 mkdir rmdir 是用来将一个"空的"目录杀掉的。如果一个目录下面
没有任何档案,你就可以用 rmdir 指令将其除去。rmdir 的使用法如下:

rmdir dirname1 [ dirname2 .... ]

如果一个目录底下有其他的档案, rmdir 将无法将这个目录杀掉,除非使用
rm 指令的 -r 选项。

8. pwd
pwd 会将目前目录的路径( path )显示出来,例如:

9. cat/more/less
以上三个指令均为察看档案内容的指令。cat 的意义是猫....不不不,是
concatenate ,在字典上的意思是"连结,串成锁状"( 语出资工电子
词典 cdict ),其实就是把档案的内容显示出来的意思。 cat 有许多奇怪
的参数,较常为人所使用的是 -n 参数,也就是把显示出来的内容加上行
号。 cat 的用法如下:

cat [-n] :自标准输入读进内容,你可以用 pipe 将别的程式的输出转向
cat .
cat [-n] filename : filename 的内容读进来,显示在标准输出上。

问题在於 cat 它是不会停下来的,因此并不好用( 试想如果一个萤幕二十
四行,而一个档案四百行,cat 一出来将会劈哩啪啦不断的卷上去,使用者
很难据此得到他们所需的资讯。) 所以才有人又写了 more 出来。

more , 跟据蔡文能老师的说法是"再多一点就好"more 可以将所观察的档案
跟据终端机的形态一页页的显示出来,再根据使用者的要求换页或卷行。如果
使用者要在某一个档案中搜寻一个特定的字串,则按 / 然後跟著打所要搜寻
的单字即可进行搜寻。more 也可以找得到。more 的使用法如下:

more filename

如果你在使用中觉得已经看到了所要看的部份,可以按'q'离开 more 的使用。
在使用中按'v' 亦可以使用编辑器来编辑所观看的档案。

less 的用法与 more 极类似,原先它就是为了弥补 more 只能往前方卷页的缺
点而设计。 less 的用法如下:

less filename

其与 more 不同的是它可以按 y 来往上卷一行,并且可以用"?"来往回搜寻你所
要找的单字。

10. chmod
chmod 为变更档案模式用( change mode ) . 这个指令是用来更改档案的存取模
( access mode )。在 UNIX 一个档案上有可读(r)可写(w)可执行(x)三种模式,
分别针对该档案的拥有者( onwer )、同群者( group member )( 你可以 ls -lg
来观看某一档案的所属的 group ),以及其他人( other )。一个档案如果改成可
执行模式则系统就将其视为一个可执行档,而一个目录的可执行模式代表使用者
有进入该目录之权利。chmod 就是用来变更一些档案的模式,其使用方式如下:

chmod [ -fR ] mode filename ...

其参数的意义如下:

-f Force. chmod 不会理会失败的动作。
-R Recurive. 会将所有子树下的所有子目录及档案改为你所要改成的模式。

mode 可以为一个三位或四位的八进位数字,来表示对某些对象的存取权。详情
可参阅 chmod(1) manual page 中有关 Absolute Modes 的说明。

或是用一个字串来表示,请参考 chmod(1) 的说明。
b. 关於 Process 处理的指令:

1. ps
ps 是用来显示目前你的 process 或系统 processes 的状况。
以下列出比较常用的参数:

其选项说明如下:
-a 列出包括其他 users process 状况。
-u 显示 user - oriented process 状况
-x 显示包括没有 terminal 控制的 process 状况
-w 使用较宽的显示模式来显示 process 状况

我们可以经由 ps 取得目前 processes 的状况,如 pid , running state 等。

2. kill
kill 指令的用途是送一个 signal 给某一个 process 。因为大部份送的都是
用来杀掉 process SIGKILL SIGHUP ,因此称为 kill kill 的用法
:

kill [ -SIGNAL ] pid ...
kill -l

SIGNAL 为一个 singal 的数字,从 0 31 ,其中 9 SIGKILL ,也就是一
般用来杀掉一些无法正常 terminate 的讯号。其馀讯号的用途可参考 sigvec(2)
中对 signal 的说明。

你也可以用 kill -l 来察看可代替 signal 号码的数目字。kill 的详细情形
请参阅 man kill

c. 关於字串处理的指令:

1. echo
echo 是用来显示一字串在终端机上。□ echo -n 则是当显示完之後不会有跳行的动作。


2. grep/fgrep
grep 为一过滤器,它可自一个或多个档案中过滤出具有某个字串的行,或是
自标准输入过滤出具有某个字串的行。

fgrep 可将欲过滤的一群字串放在某一个档案中,然後使用 fgrep 将包含有
属於这一群字串的行过滤出来。

grep fgrep 的用法如下:

grep [-nv] match_pattern file1 file2 ....
fgrep [-nv] -f pattern_file file1 file2 ....

-n 把所找到的行在行前加上行号列出
-v 把不包含 match_pattern 的行列出
match_pattern 所要搜寻的字串
-f pattern_file 存放所要搜寻的字串

d. 网路上查询状况的指令:

1. man
man 是手册 ( manual ) 的意思。 UNIX 提供线上辅助( on-line help )的功能,
man 就是用来让使用者在使用时查询指令、系统呼叫、标准程式库函式、各种表
格等的使用所用的。man 的用法如下:

man [-M path] [[section] title ] .....
man [-M path] -k keyword ...

-M path man 所需要的 manual database 的路径。
我们也可以用设定环境变数 MANPATH 的方式来取代 -M 选项。
title 这是所要查询的目的物。
section 为一个数字表示 manual 的分类,通常 1 代表可执行指令,
2 代表系统呼叫( system call ) 3 代表标准函数,等等。

像下面 man 查询的片段:

SEE ALSO
apropos(1), cat(1V), col(1V), eqn(1), lpr(1), more(1),
nroff(1), refer(1), tbl(1), troff(1), vgrind(1), vtroff(1),
whatis(1), eqnchar(7), man(7), catman(8)

我们如要参考 eqnchar(7) 的资料,则我们就输入 man 7 eqnchar
便能取得我们所要的辅助讯息。
-k keyword
用来将含有这项 keyword title 列出来。

man UNIX 上是一项非常重要的指令,我们在本讲义中所述之用法均仅只是一
个大家比较常用的用法以及简单的说明,真正详细的用法与说明还是要请你使用
man 来得到。

2. who
who 指令是用来查询目前有那些人在线上。

3. w

w 指令是用来查询目前有那些人在线上,同时显示出那些人目前的工作。

4. ku
ku 可以用来搜寻整个网路上的 user ,不像 w who 只是针对 local host
查询. 而且 ku 提供让使用者建立搜寻特定使用者名单的功能。你可以建立一个档
information-file 以条列的方式存放你的朋友的资料,再建立一个档案
hosts-file 来指定搜寻的机器名称。 ku 的指令格式可由 ku -h 得到。

E. 网路指令:

UNIX 提供网路的连接,使得你可以在各个不同的机器上做一些特殊的事情,如
你可以在系上的 iris 图形工作站上做图形的处理,在系上的 Sun 上读 News
甚至到学校的计中去找别系的同学 talk 。这些工作可以利用 UNIX 的网路指
令,在你的位子上连到各个不同的机器上工作。如此一来,即使你在寝室,也能
轻易的连至系上或计中来工作,不用像以前的人必须泡在冷冰冰的机房面。

这些网路的指令如下所述:

1. rlogin rsh
rlogin 的意义是 remote login , 也就是经由网路到另外一部机器 login
rlogin 的格式是:

rlogin host [ -l username ]

选项 -l username 是当你在远方的机器上的 username local host 不同的
时後,必须输入的选项,否则 rlogin 将会假设你在那边的 username local
host 相同,然後在第一次 login 时必然会发生错误。

rsh 是在远方的机器上执行某些指令,而把结果传回 local host rsh 的格式
如下:

rsh host [ -l username ] [ command ]

如同 rlogin 的参数 -l username , rsh -l username 也是指定 remote host
username 。而 command 则是要在 remote host 上执行的指令。如果没有
指定 command ,则 rsh 会去执行 rlogin ,如同直接执行 rlogin

不过 rsh 在执行的时候并不会像一般的 login 程序一样还会问你 password ,
是如果你没有设定 trust table , remote host 将不会接受你的 request

rsh 须要在每个可能会做为 remote host 的机器上设定一个档案,称为 .rhosts
这个档案每一行分为两个部份,第一个是允许 login hostname , 第二个部份
则是允许 login username 。例如,在 ccsun7.csie.nctu.edu.tw 上头你的
username ysjuang , 而你的 home 下面的 .rhost 有以下的一行:

ccsun6.cc.nctu.edu.tw u8217529

则在 ccsun6.cc.nctu.edu.tw 机器上的 user u8217529 就可以用以下的方法来
执行 rsh 程式:

% rsh ccsun7.csie.nctu.edu.tw -l ysjuang cat mbox

ysjuang ccsun7.csie.nctu.edu.tw 上的 mbox 档案内容显示在 local host
ccsun6.cc.nctu.edu.tw 上。

而如果 .rhost 有这样的一行,则 ccsun6.cc.nctu.edu.tw 上的 user u8217529
将可以不用输入 password 而直接经由 rsh rlogin login
ccsun7.csie.nctu.edu.tw 来。

注意:

.rhost 是一个设定可以信任的人 login 的表格,因此如果设定不当将会让
不法之徒有可以乘机侵入系统的机会。 如果你阅读 man 5 rhosts ,将会
发现你可以在第一栏用 + 来取代任何 hostname ,第二栏用 + 来取代任何
username

如一般 user 喜欢偷懒利用 " + username " 来代替列一长串 hostname
但是这样将会使得即使有一台 PC 上跑 UNIX user 有与你相同的
username , 也可以得到你的 trust 而侵入你的系统。这样容易造成系统
安全上的危险。因此本系禁止使用这样子的方式写你的 .rhost 档,如果
发现将予以停机直到你找中心的工作人员将其改正为止。 同理,如果你的
第二个栏位为 + ,如" hostname + " ,则你是允许在某一部机器上的"所有"
user 可以不用经由输入 password 来进入你的帐号,是壹种更危险的行为。
所以请自行小心。

2. telnet
telnet 是一个提供 user 经由网路连到 remote host
telnet 格式如下:

telnet [ hostname | ip-address ] [ port ]

hostname 为一个像 ccsun1 或是 ccsun1.cc.nctu.edu.tw name address
ip-address 则为一个由四个小於 255 的数字组成的 ip address ,如 ccsun1
ip-address 140.113.17.173 ccsun1.cc.nctu.edu.tw ip-address
140.113.4.11 。你可以利用 telnet ccsun1 telnet 140.113.17.173
连到 ccsun1

port 为一些特殊的程式所提供给外界的沟通点,如资工系的 MUD server 便
提供一些 port user 由这些 port 进入 MUD 程式。详情请参阅 telnet(1)
的说明。


3. ftp
ftp 的意义是 File Transfer Program ,是一个很常应用在网路档案传输的
程式。ftp 的格式如下:

ftp [ hostname | ip-address ]

其中 hostname | ip-address 的意义跟 telnet 中的相同。

在进入 ftp 之後,如果与 remote host 连接上了,它将会询问你 username
与密码,如果输入对了就可以开始进行档案传输。

ftp 中有许多的命令,详细的使用方式请参考 ftp(1) ,这里仅列出较常
用的 cd , lcd , mkdir , put , mput , get , mget , binary , ascii ,
prompt , help quit 的使用方式。

ascii 将传输模式设为 ascii 模式。通常用於传送文字档。

binary 将传输模式设为 binary 模式,通常用於传送执行档,压缩档与影像
档等。
cd remote-directory remote host 上的工作目录改变。

lcd [ directory ] 更改 local host 的工作目录。

ls [ remote-directory ] [ local-file ] 列出 remote host 上的档案。

get remote-file [ local-file ] 取得远方的档案。

mget remote-files 可使用通用字元一次取得多个档案。

put local-file [ remote-file] local host 的档案送到 remote host

mput local-files 可使用通用字元一次将多个档案放到 remote host 上。

help [ command ] 线上辅助指令。

mkdir directory-name remote host 造一个目录。

prompt 更改交谈模式,若为 on 则在 mput mget 时每作一个档案之传
输时均会询问。

quit/bye 离开ftp .

利用 ftp ,我们便可以在不同的机器上将所需要的资料做转移,某些特别的
机器更存放大量的资料以供各地的使用者抓取,本校较著名的 ftp server
NCTUCCCA 与系上的 ftp.csie.nctu.edu.tw 。这些 ftp server 均有提
供一个 user 称为 anonymous ,一般的"外来客"可以利用这个 username
得该 server 的公共资料。不过 anonymous 在询问 password 时是要求使用
anonymous 的使用者输入其 email address,以往有许多台湾的使用者在使用
国外的 ftp server 时并没有按照人家的要求输入其 email address,而仅是
随便打一些字串,引起许多 internet user 和管理者的不满,对台湾的使用
者的风评变得很差,因此遵循各 ftp server 的使用规则也是一件相当重要的事。

f. 关於通讯用的指令:

1. write
这个指令是提供使用者传送讯息给另一个使用者,使用方式:
write username [tty]

2. talk/ytalk/cytalk/ctalk
UNIX 专用的交谈程式。会将萤幕分隔开为你的区域和交谈对象的区域,
同时也可和不同机器的使用者交谈。使用方式:

talk username[@host] [tty]

3. mesg
选择是否接受他人的 messege , 若为 messege no 则他人的 messege 将无法
传送给你,同时他也无法干扰你的工作。使用方法:

mesg [-n|-y]

4. mail/elm
在网路上的 email 程式,可经由此程式将信件 mail 给他人。 使用方式:

mail [username]
mail -f mailboxfile

如有信件,则直接键入 mail 可以读取你的 mail .

elm 提供较 mail 更为方便的介面,而且可做线上的 alias . 你可以进入 elm
使用上下左右键来选读取的信件,并可按 h 取得线上的 help 文件。

使用方式:

elm [usernmae]
elm -f mailboxfile

g. 编译器( Compiler ):
Compiler 的用处在於将你所撰写的程式翻译成一个可执行档案。在资工系常
用的程式语言是 C , pascal , FORTRAN 等。你可以先写好一个 C Pascal
FORTRAN 的原始程式档,再用这些 compiler 将其翻成可执行档。你可以
用这个方法来制造你自己的特殊指令。

1. cc/gcc (C Compiler)
/usr/bin/cc
/usr/local/bin/gcc

语法: cc [ -o execfile ] source
gcc [ -o execfile ] source

execfile 是你所希望的执行档的名称,如果没有加上 -o 选项编译出来的可
执行档会以 a.out 做为档名。 source 为一个以 .c 做为结尾的 C 程式档。
请参阅 cc(1) 的说明。

2. pc (Pascal Compiler)
/usr/local/bin/pc

语法: pc [ -o execfile ] source

execfile 是你所希望的执行档的名称,如果没有加上 -o 选项编译出来的可
执行档会以 a.out 做为档名。 source 为一个以 .p 做为结尾的 Pascal
式档。 请参阅 /net/home5/lang/man pc(1) 的说明。

3. f77 (Fortran Compiler)
/net/home5/lang/f77

语法: f77 [ -o execfile ] source

execfile 是你所希望的执行档的名称,如果没有加上 -o 选项编译出来的可
执行档会以 a.out 做为档名。 source 为一个以 .p 做为结尾的 FORTRAN
式档。

h. 有关列印的指令:
以下为印表所会用到的指令,在本系的印表机有 lp1 , lp2 ( 点矩阵印表机 )
lw , sp , ps , compaq ( 雷射印表机 ),供使用者使用。

1. lpr
lpr 为用来将一个档案印至列表机的指令。

用法:
lpr -P[ printer ] file1 file2 file3 ....


lpr -P[ printer ] < file1

例子:
lpr -Plp1 hello.c hello.lst hello.map
lpr -Plp1 < hello.c

前者以参数输入所要印出的档案内容,後者列印标准输入档案( standard input )
的内容,因已将 hello.c 转向到标准输入,故会印出 hello.c 的档案内容。

2. lpq
lpq 是用来观察 printer queue 上的 Jobs

用法:
lpq -P[ printer ]


3. lprm
lprm 是用来取消列印要求的指令。 通常我们有时会印错,或是误送非文字档
资料至 printer , 此时就必须利用 lprm 取消列印 request ,以免造成资源
的浪费。

用法:
lprm -P[ printer ] [ Jobs id | username ]

lprm 用来清除 printer queue 中的 Jobs , 如果你使用 Job Id 作为参数,则
它将此 Job printer queue 清除,如果你用 username作为参数,则它将此 queue
中所有 Owner 为此 username Jobs 清除。

i. 更改个人使用资料:

1. passwd
passwd 是用来更改你的使用密码,用法为:

passwd [ username ]

在使用 passwd 的时候,它会先问你的旧密码,然後询问两次要更改的密码,确定
无误後才将你的密码改掉。

2. chsh
chsh 是提供使用者更换 login shell 的指令,你可经由此更换自己使用的 shell