From DOS to Linux

/ns/wz/otherwz/data/20020820032516.htm


前言


这个 mini-HOWTO 是为(将成为曾经是??) DOS 的使用者而写的. 尤其是那些
已经饱受
DOS 凌虐而准备投向 Linux , 这个在 i386 上 Un*x clone OS 的朋友.

当我在我的 PC 上安装 Linux 後, 我很希望能够迅速的了解并且利用它. 我相信这也
是每个人的期望. 你可能已经知道 DOS 可以视为 Un*x 的一角. 身为一位
"资深" DOS
使用者, 我可以告诉你它们有许多的相似之概念: 档案系统, 目录, 环境变数, 程式的
执行, .BAT 档案..等等. 这篇文章的目的在於让已经用过 DOS 的使用者能够将他们在
DOS 上的认识转换到 Linux 上. 你尽可以在床上读个几页, 当然, 之後再去 PC 上
操作或许会更好.

在此, 我仍然要强调, 这篇文章 *不是* Linux 的入门课程 -- 对初学者而言, 我建议
你能够有一份 Matt Welsh 所写的 "Linux Installation and Getting Started",
这篇文章在 sunsite.unc.edu 或是其 mirrors, 放在 /pub/Linux/docs/LDP 下; 写得
很不错而且易懂. 另外 HOWTO 和 FAQ 也是不错的选择. 而这篇文章并不是以上作品的
同类型文章, 只是一定有一些家伙 (我就是其一) 在只看了二十页不到 (而非全部的
200 页以上), 就迫不及待的想要进入 Linux 的世界.


第零节: 介绍

0.1: Linux 就是你要的吗??

这个世界上并不存在著"最好的电脑" 或是 "最棒的 OS"(作业系统): 这完全视你的
需求而定. 比方说, 我很不喜欢 Mac (得罪了 :) : 它的确很容易使用, 但我还是喜欢
PC 帮我完成某些事. (试试在 Mac 上做和 dir/s/w >lst 一样的事) 至今, 对许多人
而言 Mac 只是 "最好" 的电脑. 同样的, 我也不认为 Linux 是最好的 OS : 显然,
Linux 优於 Win95, 但是很多人还是喜欢後者(Win95).

Un*x 的主要诉求对象是以程式设计师和科学家, 而 Mac & Win 是针对著一般性的使用者
而设计的. 因此, Linux 足以提供一个广阔的天空 -- 如果你需要的是 Compilers, 网路,
以及学术实验性质的软体, 而你也喜欢三不五时的修理你的 Linux : 换句话说, 你喜欢
hacking. 另一方面, 假使你非得要求有帮你完成所有事的对话框, 需要使用商用套装程
式, 或是说, 你对命令列的提示号有失落感的话 ... 那你还是早点死心吧...:p

接下来就看你了. 但在此之前先提醒一件事: Linux 和 DOS/Windows 是可以在同一台
电脑上并存的.


0.2: 这就是我要的!! 请告诉我更多一些!!

现在, 假设你已经装好了 Linux. 依照安装步骤, 你也应该有个帐号(account) (如果
不是这样, 请参考 6.1 节). 现在你的 Linux 已经在运作当中了. 或许有人已经告诉
你, 所有你需要的软体都已经在系统里了, 而你该做的就是 login. 这时你键入了 login
name, password, 然後两眼对著萤幕发直 -- "好啦, 但再来呢??"

别失望.. 你尽可以完成从前你在 DOS 下的工作, 甚至更多. 设想一下, 你现在面对
的不是 Linux, 而是 DOS. 这时, 你应该会作下列的工作:

1. 执行程式; 建立, 复制, 编修档案或是改变档名 -- 维护档案;
2. 建立, 删除, 或是在目录间跳动 -- 维护目录;
3. 格式化磁片然後备份档案 -- 磁碟处理;
4. 修修补补 autoexec.bat 和 config.sys 这两个档 -- 系统维护;
5. 写自己的程式, 可能是 .bat 或是 qbasic -- 程序处理;
6. ..其它还有吗..?? :)

你一定很高兴知道, 上述的事在 Linux 下一样可以完成, 而且方法和 DOS 极为相似.
在 DOS 下, 一般使用者使用的命令只是系统提供的许多命令中的少数几个 -- Linux
也一样. 在此, 如果你并未熟悉完成上述六点的相关 DOS 命令, 那请你先暂停.. 先
去翻翻 DOS 使用手册吧. 在往後的讨论里, 本文将不会对诸如什麽是目录或是 PATH
是什麽来做解释.

在继续讨论前的一些注意事项:

1) 和 DOS 不同, Linux 具有一些内建的系统安全机制. 在你打开 PC 电源然後启动
Linux 之後, 你必需 "log in", 这是为了使系统知道你即将使用系统并工作; 这是因
为 Un*x 是一个多人使用的 OS. 此外, 一般的使用者并非拥有这台电脑(的一切资源);
只有使用 root 来做 login 的使用者才是真正的拥有者(这个人就是所谓的系统管理者,
在你在己的 PC 上, 你就是 root); 每个档案及目录都有存取权限的定义, 这使得有些
档案无法被一般使用者存取. 另一方面, DOS, 却无法提供这些保护 -- 你可以存取整颗
的硬碟.

2) 一旦你结束工作要关机, 请 *不要* 马上切断 PC 的电源 ! 相反的, 这必须经过一
些正当的程序 (按下 ctrl-alt-del , 等到系统做完例行的检查之後, 告诉你 OK, 才可
以关掉电源). 从另一个角度来说, Linux 是一个很稳定的系统, 你完全不必担心一旦有
某个错误的应用程式导致系统挂掉, 逼迫你必需按下 reset 钮 :p

3) 我们非常鼓励你多尝试与实验 : 请放心, 这样不会对系统造成伤害 (ps. 前提是你
并不是用 root 的身份来尝试). 你可以在提示号後面打以下指令以得到帮助 ($ 是标准
提示号, 而 # 是 root 专用的) :
$ help
(相当合乎逻辑), 或是想得到更多讯息:
$ man
在这里, 如果你已经安装了 man pages, 那麽这样就会将与 相关的 manual
(man 的原字) page 印出来. 你也可以试试这样:
$ apropos

$ whatis

4) 通用规则 (help, man ..etc)

a) <...> 表示必须给定的参数, [...] 则可有可无. 例如 :
$ tar -tf [> redir_file]
file.tar 一定要指定, 但是 redir (重新导向输出档) 是可以不用加的.
b) 以下 "RMP" 表示 "Read the Man Pages for further information" -- "请看 man
page".

你现在已经可以继续阅读下面的部份了.


第一节: 档案维护

1.1. 档案: 前言

Linux 拥有一个档案系统 - 意思是 "一个有很多档案和目录的结构" - 和 DOS 非常
相似. 档案都有一个名称(档名, 它的组成必须要遵循一些规则), 被置放在目录当中.
有些是可执行的程式, 它们必须要一些额外的参数才可以正确执行. 另外, 你也可以使用
"万用字元" (wild card) , 输出/入导向, 管道(piping). 但, 和 DOS 仍有些许的不同.

- - 第一: 在 DOS 下, 档名必须遵守 8.3 格式的规则. 比方说 NOTENOUG.TXT. 在
Linux 里我们有比较自由的空间. 假如你的 Linux 已经安装在 ext2 或是 umsdos 等等的
档案系统上, 你就可以使用长档名来为档案取名, 这样可以使档名中包含更多的字元和
"点". 举个例子, This_is.a.VERY_long.filename. 请注意到我用了大写和小写的字母,
而事实上...

- - 第二: 大小写是不一样的. 因此, FILENAME.tar.gz 和 filename.tar.gz 是两个不
同的档案. 这个规则在命令来说也是成立的: 当使用 ls 这个指令 (和 DOS 的 DIR 类似)
会得到目录下案的列表, 但是用 LS 的话, 系统只会丢给你一个错误的讯息.

- - 第三: 用 "." 开始的档案名称会被视作隐藏档. 例如: .I.am.a.hidden.file ,
使用 ls 时就看不到了 (ps. 用 ls -a 可以看见隐藏档)

- - 第四: Linux 并没有规定可执行档一定要有 .COM , .EXE 或 .BAT 的延伸档名. 如
果我们用 ls -F 这个命令, 就会发现执行档後面会被加上一个 '*'. 例如:
$ ls -F
letter_to_Joe Cindy.jpg cjpg* I_am_a_dir/ my_1st_script*
cjpg* , my_1st_script* 是可以被执行的. 在 DOS 中, .BAK 表示备份档案, 而 Linux
则在档名尾加上一个 '~'.

- - 第五: DOS 程式需要的参数要用 /switch 的方法给予, 而 Linux 却是用 -switch.
就像 dir /s 与 ls -R. 附注一点, DOS 下的某些程式如 PKZIP 和 ARJ, 是用和 Un*x
一样的参数给定方式.


1.2. 档案: 对应 DOS 与 Linux 相关的指令


左边是 DOS 的命令; 右边是 Linux 里具用同样功能的指令.
COPY: cp
DEL: rm
REN: mv
TYPE: more, less, cat

Redirection and plumbing operators: < > >> |
Wildcards: * ?
nul: /dev/null
prn, lst: /dev/lp0; lpr

- - EXAMPLES -

DOS Linux

C:\GUIDO>copy joe.txt joe.doc $ cp joe.txt joe.doc
C:\GUIDO>copy *.* total $ cat * > total
C:\GUIDO>copy fractals.doc prn $ cat fractals.doc | lpr
C:\GUIDO>del temp $ rm temp
C:\GUIDO>del *.bak $ rm *~
C:\GUIDO>ren paper.txt paper.asc $ mv paper.txt paper.asc
C:\GUIDO>type letter.txt $ more letter.txt
C:\GUIDO>type letter.txt $ less letter.txt
C:\GUIDO>type letter.txt > nul $ cat letter.txt >/dev/null
n/a $ more *.txt *.asc
n/a $ cat section*.txt

附注:

1) * 在 Linux 中变得聪明多了:
- - * 表示除了隐藏档外的所有档案; .* 表示所有隐藏档; *.* 就是"某些字元" +
一个点 + "某些字元" 的档案名称;
- - p*r 可以满足 peter 和 piper 两个字; picked 和 peck 也都可以表为 *c* ;
2) 使用 more 这个命令时, 按下 可以继续阅读下一页, 'q' 或 ctrl-c 结束.
less 和 more 类似, 但可用方向键.
3) Linux 里 *没有* UNDELETE 这种命令. 所以, 砍掉档案前要三思啊..
4) 除了 DOS 中的 < > >> 之外, Linux 可以使用 2> 来对错误讯息导向. (stderr)
5) Linux 有另外一组万用字元: []. 使用:
- - [abc]* 表示以 a, b, 或是 c 开头的档案;
- - [I-N]* 表示由 I, J, K, L, M, 或 N 开头的档案;
6) 没有像 DOS 一样的 rename 可用; 也就是说, ren *.xxx *.yyy 是无效的.

1.3. 执行程式: 多工与 Session

要执行一个程式, 就像 DOS 一样键入它的名字就可以了. 如果说这个程式被放在 PATH
(第四节) 指定的目录 (第二节), 那麽该程式就会被启动. 例外的是, Linux 不像 DOS
可以执行放在现行目录下的程式 (.) , 除非 . 已经加入 PATH 中了. 若要执行现行
目录下的程式, 可以这样做: ./.

这是一个标准命令的格式:
$ command -s1 -s2 ... -sn par1 par2 ... parn < input >output
-s1 , -s2 ... -sn 是命令选项, parn 是程式参数. 我们可以在同一行上键入数个命令:
$ command1 ; command2 ; ... ; commandn
这就是执行命令的方法, 但是我们可以更进一步. 一个使我们使用 Linux 的主要原因
是, 它是一个多工的系统 -- 它可以同时执行数个程式 (以下, '程式'用'行程'代替)
你可以将一个原本在背景执行的行程提升到前景并继续执行. 而且, Linux 可以使你有
多个 session : 这就像同时有好几台电脑在工作!

- - 切换 session 1..8:
$ ... .
- - 开始一个新的 session , 但不离开原本 session :
$ su -
例如:
$ su - root
这相当有用. 比如, 当你要 mount 一个磁碟(机) 时. 因为只有 root可以作这件事.
- - 结束一个 session:
$ exit
- - 在前景执行一个行程:
$ progname [-switches] [parameters] [output]
- - 在背景启动一个行程(在背景执行) 要加上 '&' 这个符号:
$ progname [-switches] [parameters] [output] &
- - 查看有多少行程正在执行:
$ ps
这样会列出一个表格. 每一个行程都会有一个 PID 来识别 (一个数字).
- - 杀掉一个行程:
$ kill
有时後你必需用这个方法来结束一些行程 (当你不知道怎样正确结束时 :) 一个行程或许
要用以下方法才可以结束:
$ kill -15
$ kill -9
此外, shell (像 COMMAND.COM 相等的东西) 允许你暂停某个行程的执行, 或是把前景
换到背景执行, 背景换来前景. 我们用'工作'来称呼行程.
- - 查看有多少工做:
$ jobs
这样列出来的工作是以一个 shell 分配的数字来区别的, 而不是用 PID.
- - 暂停一个前景的行程:
$
(但不总是有效 :p )
- - 暂停前景的程式:
$
(ditto)
- - 将一个被暂停的程式移到背景继续执行:
$ bg
- - 把一个背景执行中的程式提升到前景:
$ fg
- - 再一次的, 要砍掉一个行程:
$ kill %
这里的 可能是 1, 2, 3, ... 有了这些命令你就可以在同一个时间格式化磁碟,
压缩档案, 编译一个程式, 还可以解压缩, 而且, 你仍然还是看到提示号和游标在等
待你的命令. 不妨在 DOS 下试试看这麽做吧!! 在 Windows 下也试试, 比较一下它们
效率的不同, 然後你就会知道你的选择是否正确了.


第二节: 使用目录

2.1. 目录: 前言

我们已经大略看过 DOS 和 Linux 在档案处理方面的不同. 在目录方面, DOS 用 \
表示根目录, Linux 则是 /. 同样的, 巢状表示的目录, DOS也用 \ 来分隔每一层次
目录, Linux 用 /. 比方说以下路径:
DOS: \PROGRAMS\C++\SOURCES\HELLO.CPP
Linux: /home/guido/papers/geology/mid_eocene.tex

相同的是, .. 表示上一层目录, . 表示现行目录. 记得一件事, 系统并不允许你在任何
地方 cd , rd, 或是 md. 每一个 user 都有一个自己的目录称作是 home, (这是系统管
理者分配的) 例如在我自己的 PC 上, 我的 home 是 /home/guido.

2.2. 对应 DOS 和 Linux 中的相关指令

DIR: ls, find, du
CD: cd, pwd
MD: mkdir
RD: rmdir

- - EXAMPLES -

DOS Linux

C:\GUIDO>dir $ ls
C:\GUIDO>dir file.txt $ ls file.txt
C:\GUIDO>dir *.h *.c $ ls *.h *.c
C:\GUIDO>dir/p $ ls | more
C:\GUIDO>dir \*.tmp /s $ find / -name "*.tmp"
C:\GUIDO>cd $ pwd
n/a - see note $ cd
n/a - see note $ cd ~
n/a - see note $ cd ~/temp
C:\GUIDO>cd \other $ cd /other
C:\GUIDO>cd ..\temp\trash $ cd ../temp/trash
C:\GUIDO>md newprogs $ mkdir newprogs
C:\GUIDO>md \progs\turbo $ mkdir /progs/turbo
C:\GUIDO>rd newprogs $ rmdir newprogs
C:\GUIDO>rd \progs\turbo $ rmdir /progs/turbo

附注: ~ 是 home 的一个缩写. cd ~ 可以使你瞬间回到自己的 home, 不论你在哪里.
cd ~/tmp 会带你到 /home/your_home/tmp. 这样, 可以了解吗??

第三节: 软碟, 硬碟, 和类似装置

3.1. 使用软式磁碟

或许你从未想过, 但 DOS 的 FORMAT A: 作了比它看起来更多的事. 事实上, 当你键入
FORMAT 这个命令时, 它会:

1) 实际的去格式化磁碟;
2) 建立 A:\ 这个目录 (= 建立一个档案系统);
3) 使这个磁碟能够被使用者使用 (= mount 一个磁碟机).

这三个步骤在 Linux 中是分开的. 我们可以在 Linux 中建立及使用 MS-DOS 格式的磁碟,
但是当然还有其它的格式可用. 最常用的要算是 ext2. 以下是准备一份可用的磁碟之方法
(请先 su 为 root):

- - 格式化一张 1,44 Meg 的软碟 (A:)
# fdformat /dev/fd0H1440

- - 建立一个档案系统:
# mkfs -t ext2 -c /dev/fd0H1440

# mformat a:
建立一个 MS-DOS 的档案系统.

在使用这张磁片前, 你需要先将这个磁片连同磁碟机 mount.
- - mount 一个磁碟机:
# mount -t ext2 /dev/fd0 /mnt
or
# mount -t msdos /dev/fd0 /mnt

现在你已经可以使用这张磁片了. 当你结束工作, 要拿出磁片前, 请你 *一定* 要
umount. (重要!)
# umount /mnt
好, 你可以把磁片拿出来了. 很明显的, fdformat 和 mkfs 只要对未格式化的磁片进
行就可以了, 已作过的就不需要了. 如果要使用 B 磁碟机, 请参考前述的范例, 用
fd1H1440 和 fd1 替换 fd0H1440 和 fd0.

现在你从前对 A: , B: 的工作现在都移转到 /mnt 下了. 例如:

DOS Linux

C:\GUIDO>dir a: $ ls /mnt
C:\GUIDO>copy a:*.* \docs\temp $ cp /mnt/* /docs/temp
C:\GUIDO>copy *.zip a:\zip $ cp *.zip /mnt/zip
C:\GUIDO>a: $ cd /mnt
A:\> /mnt$

不消说, 对软碟成立的方法, 对其它的 device 一样成立. 比方, 你可以 mount 另一
个硬碟或是光碟机. 稍微看一下 /dev 下的 device. 下面是 mount 一个光碟机的范例:
# mount -t iso9660 /dev/cdrom /cdrom


第四节: 量身订作一个 OS

4.1. 系统初始化相关档案

在 DOS 中有两个很重要的档案 -- AUTOEXEC.BAT 和 CONFIG.SYS. 当启动 DOS 时,
这两个档案负责一些系统的设定工作 , 诸如设定环境变数 PATH, FILES 等等, 甚至
呼叫其它必需在开机时载入的程式.

在 Linux 中也有一些类似工作的档案, 但其中有些却是相当的危险; 再你真正了解
你将要做的事之前, 请千万别去碰它. 无论如何, 我还是得告诉你那些需要特别谨慎
的档案:

FILES NOTES

/etc/inittab don't touch for now!
/etc/rc.d/* ditto

如果你想做的是设定 PATH 或是其它的环境变数, 抑或修改 login 时的讯息, 呼叫一个
程式, 以下大概就是你要的:

FILES NOTES

/etc/issue sets pre-login message 设定 login 前的讯息
/etc/motd sets post-login message 设定 login 後的讯习
/etc/profile sets PATH and other variables, etc. 设定环境变数
/home/your_home/.profile does whatever you want 这里可以随意加入你想要的

如果最後那一个档案(~/.profile) 存在, (注意到它是隐藏档), 那麽在你 login 之後
它的内含命令就会被执行.

范例 - 请看这个 .profile:

# I am a comment
echo Environment:
printenv | more # equivalent of command SET under DOS
alias d='ls -l' # easy to understand what an alias is
alias up='cd ..'
echo "I remind you that the path is "$PATH
echo "Have a good day, "$LOGNAME

PATH 和 LOGNAME, 正如你所预料的, 是两个环境变数.

4.2. 程式初始化设定档

在 Linux 下, 一般来说所有的事都可以依照你的要求而作安排. 大多数的程式都有
它们自己的初始化设定档, 这些都可以由你来修改. 通常, 它们都以 .prognamerc 的
型式存在於 home 目录里. 在这里, 首先你可能需要接触的设定档有:

..xinitrc: 用来初始化 X Window System.
..fvwmrc: 初始化 fvwm 这个 window manager. 你可以在
/usr/lib/X11/fvwm/system.fvwmrc 找到范例.
..xfm/*: xfm (一个 file manager) 的设定档.
..Xdefault: 由 rxvt -- 一个终端机模拟程式 -- 所使用.

对於这些设定档, 或是你将来会遇到的其它档案, 请查 Man page.


第五节: 关於程式设计

5.1. 编写叙述程式 (Scripts): .BAT 档的聚合体

你或许使用过 .BAT 来当做一长串命令的缩写 (我常做这种事). 这件事可以藉由在
profile 或 .profile 中设定 alias 来达成. 但是, 一旦 .BAT 档太过复杂, 那麽你
会喜欢由 shell 提供的叙述语言 (Scripting language) : 它几乎和 Qbasic 一样强
大而且易用. 它可以使用变数, 可以拥有像是 while , for, case if.. then .. else,
的语法结构; 它还有其它的优点 -- 例如, 它可以当成是程式语言的替代品.

要撰写一个 script - 就像在 DOS 下写 .BAT 档一样 - 只要编写一个 ASCII 的档案,
内含你想要的指令, 然後储存, 再使用下面这个命令让它可以被执行:
$ chgmod u+x
当要执行时, 只要键入它的档名就可以了.

这里有个小小的警告: 系统内定的编辑器叫作 vi, 它有一点难以使用, 我想你应该也
会这样认为它有些烦人. 我不会在这篇文章中讨论它 -- 我自己也还尚未找到使用的窍
门 :p 请参考 Matt Welsh 的 "Linux installation... ", 109 页. 但你也可以使用其
它的编辑器, 如 joe 或是 X 下的 emacs. 这里只稍为说明一点你必需知道的 vi 知识
(至少让你可以 quit :p )

- - 加入一段文字可以用在文章中按下 'i';
- - 离开 vi 但不储存文章 : 请按 ESC 再打 :q!
- - 离开且存存 : 按 ESC, 再打 :wq

在 Linux 中编写 shell script 是一门大学问 -- 它几乎要一本书才能讲得详细.
本文不会再更深入的讨论这个问题; 但是, 以下提供了几个有用(希望是)的范例, 希望
能够使你对 shell script 有个初步的了解.

EXAMPLE 1: first_script

#!/bin/sh
# I am a comment
# don't change the first line - it's got to be there
echo "Today is `date`"
echo "My name is "$0
echo "You gave me the following "$#" parameters: "$*
echo "First parameter is "$1
echo "Have you grasped the trick?"

EXAMPLE 2: 2exe

#!/bin/sh
echo "making "$1" executable... "
chmod u+x $1

EXAMPLE 3: backup

#!/bin/sh
echo "Copying files in ~/bak... "
for name in $*
do
cp ${name} ~/bak
done

EXAMPLE 4: fmta

#!/bin/sh
echo "I remind you that only root can format disks"
fdformat /dev/fd0H1440
mkfs -t ext2 -c /dev/fd0H1440
echo "disk formatted."

EXAMPLE 5: mnta

#!/bin/sh
echo "I remind you that only root can mount disks"
mount -t msdos /dev/fd0 /mnt
echo "don't forget to umount when you've done."

5.2. 自己写个 C 程式

你应该不会期待在 Linux 有 GW/Qbasic 吧?? 在 Un*x 中, 系统内定的语言是 C,
不管你是喜欢还是讨厌它. 当然还有其它的语言可以用 (FORTRAN, Pascal, Lisp, Bacic
.. 但没有 Turbo Pascal ^Q^ ).

假设你懂得 C.. 如果你曾经被 Turbo C++ 或是它在 DOS 下的兄弟们宠爱过, 那这里
有两句话恐怕不啻晴天霹雳: Linux 下的 C 编译器叫作 gcc, 但, 它没有 IDE 环境,
没有线上求助系统, 没有整合式除错器,..等等. 只有一个命令列的编译器, 但强大
且有效率. 以下这个命令可以编译你已写好的 hello.c :
$ gcc hello.c
这样会产生一个 a.out 的执行档. 如果你想让 gcc 造出其它档名的执行档, 键入
$ gcc -o hola hello.c
要联结一个程式库, 你要在 gcc 後加上一个 -l 的选项. 比如说要联结 math
library
$ gcc -o mathprog mathprog.c -lm
( -l 会迫使 gcc 联结 /usr/lib/lib.a; 因此, -lm 会联结
/usr/lib/libm.a)

对小程式来说, 这是一个好方法. 但是若程式是由数个 source files 组成, 我们可能
会需要 make 这个程式. 假设我们已经写好一个语法分析程式 parser.c, 它 #include
了两个 .h : parser.h , xy.h. 现在, 有个 calc.c 需要使用到 parser.c 中的功能.
这样该怎麽办??

我们可以写一个叫作 makefile 的档案, 告诉编译器所有 source 和 object files
间的关系, 在这个例子里,

# This is makefile, used to compile calc.c
# Press the key at appropriate positions!

calc: calc.o parser.o
gcc -o calc calc.o parser.o -lm
# calc depends on two object files: calc.o and parser.o

calc.o: calc.c parser.h
gcc -c calc.c
# calc.o depends on two source files

parser.o: parser.c parser.h xy.h
gcc -c parser.c
# parser.o depends on three source files

# end of makefile.

储存, 然後键入
$ make
以便编译程式. 或者, 这个档案被存在 calc.mak 里, 那麽就必需
$ make -f calc.mak
当然, 请参阅 Man pages 以得到更多的资讯.

此外, 某些函数的用法在 man pages 可以找得到, 例如
$ man printf


第六节: 剩下的 1%

6.1. 使自己暂时脱离 root 的身份

用 root 来 login , 并且处理每天的工作实在不是一件好事情. 因为这个帐号相当
危险, 应该仅供系统维护时使用. 下面这个命令可以为你自己建立一个一般性的帐号.
用 root login, 再键入
# adduser
然後输入系统询问的资料. (如果有你看不懂的问题, 请按下 . 这样系统将会
使用预设的资料.)

6.2. 建立虚拟记忆体

虽然 Linux 理论上只要 2M 就可以执行, 但是愈多的记忆体会使工作更顺利. X Window
System 会要求至少 8M RAM , 否则它就罢工. 要使用虚拟记忆体来增加可用记忆空间,
请以 root 身份执行:
# dd if=/dev/zero of=/swapfile bs=1024 count=8192
# mkswap /swapfile 8192
# sync
# swapon /swapfile
接著把最後一行加入 /etc/rc.d/rc.local 中, 使每次开机时就会自动开启 swap.

6.3. 使用 tar & gzip

在 Un*x 中有著几个被广泛使用於保存或压缩档案. tar 是一个保存档案的工具. 它有
点类似 PKZIP 但并不会作压缩的工作 -- 它只是将许多档案包装成一个而已:
$ tar -cvf [file...]
把 tar file 解开, 要用以下的命令:
$ tar -xpvf [file...]
如果欲检视 tar file 中的档案列表,
$ tar -tf | less
用 compress 或是 gzip 可以压缩档案. 压缩後档案就无法再使用除非解开来:
$ compress
or:
$ gzip
这样建立出来的压缩档会以 .Z (compress) 或 .gz (gzip) 作为延伸档名. 这些档案
无法再被 compress 或 gzip 再压缩. 想将档案解压缩的话, 请用
$ compress -d
or
$ gzip -d

请参阅 Man pages.

其它像是 arj ,zip 或是 unzip (PK??ZIP 相容) 的工具在 Linux 下一样找得到.
在 Un*x 的世界里, .tar.gz 或 .tgz 的档案就像 DOS 下的 .ZIP 一般普遍.
以下这个命令可以浏览 .tar.gz 档案中的档案列表:
$ gzip -dc | tar tf - | less


6.4. 安装应用程式

大多数的 Linux 软体都以 .tar.gz 的方式包装; 有些软体就可以在 / 下用这个命令
完成安装:
# gzip -dc | tar xvf -
档案会在正确的目录中解压缩 (目录亦会自动建立好). 看来不错, 不是吗?? :)
Slackware distribution 的使用者(其实其它的 distribution 也不差, 像是 redhat)
就有一个满有亲和力的安装程式 pkgtool.

其它的软体可能有它们自己的安装方试; 你可以找到说明的文件. 此外, 有些软体
是以 C 或 C++ source code 的方式来制成, 并未编成执行档. 这时就必须自行编译.
绝大多数的情形你只要打
# make

很明显的, 你会需要 gcc -- 这个应该在所有的 distributions 中都有. 但是记住:
请用 root 身份完成以上这些软体安装的工作.

6.5. 你不能不知道的小技巧

让系统帮你键入命令: 按下 可以让系统自动补齐命令中未打完的字. 例如:
gcc this_is_a_long_name.c ; 只要键入 gcc thi 就够了. (当有数个使用以上
相同字元开始的档案时, 你必需给与一定数量的字元使系统可以判定到底你想要的是哪
一个).

回卷: 按 SHIFT + PAG UP 可以使萤幕回卷数页, 这视你拥有的 Video RAM 多寡而定.
更进一步的说, 当你要使用下面这个命令
$ script
这样会使得在萤幕上出现的任何东西都被复制到 script_file 中, 直到你使用 exit
这个命令为止. 这样就可以在稍後再来检视刚才的内容.

重设萤幕: 如果你不慎 more 或是 cat 一个像可执行档的档案, 我想你的萤幕应该会
充满了奇怪的符号. 用 reset 就可以解决这个问题:
$ reset
或是依序键入 CTRL-V ESC c RETURN.

来自 kernel 的讯息: 看一下 /var/adm/messages (以 root 身份), 里面包含了
kernel 要告诉你的资讯, 其中有启动时出现的讯息.

6.6. 一些有用的程式

最重要的一件事就是, 要怎样找到这些软体. 我想大家都已经知道如何在网路中驰骋,
以及使用 archie 和 ftp. 这里列出三个最重要的 Linux 相关 ftp site:
sunsite.unc.edu, TSX-11.mit.edu, nic.funet.fi . 请使用距离你比较近的 mirror.
(ps. 国内的 nctuccca.nctu.edu.tw, linux.cis.nctu.edu.tw, ftp.ncu.edu.tw..etc)

at 可以让你在特定的日期及时间执行程式

delete-undelete 就像它们的名字一样 :)

df 会告诉你有关你的硬碟的资讯;

dosemu 能执行一些 DOS 的程式 (但非全部..ps. 我想应该是大多数了..) - 包含
Windows 3.x , 但需作些调整;

file 告诉你 是哪一种档案 (ASCII 文字档, 可执行档, 包装後
的档案 ..等等);

find (参看 2.2 节) 是最强且有用的工具之一. 它能够找寻档案系统中, 所有符合
搜寻条件的档案, 并且对它作处理. 最常见的使用方法是:
$ find
这里的 包含了搜寻的标准和对目标档案的处理动作. 例如:
$ find . -type l -exec ls -l {} \;
会找到所有的 symbolic links 并且显示它们联结的目的地.
$ find / -name "*.old" -ok rm {} \;
则找寻所有符合 *.old 型式的档案, 然後询问你是否要删除它.
$ find . -perm 755
搜寻所有存取权限为 755 的档案 (即可执行档)
$ find . -user root
会找到拥有者为 root 的档案. 其它还有很多的用法, 当然, RMP :p

grep 可以在档案中找寻一个字串. 比如说
$ grep -l "geology" *.tex
将列出所有包含 "geology" 这个字的 tex 档. 其馀请 RMP;

gzexe 将可执行档压缩, 但仍可执行;

joe 是一个很棒的编辑器. 用 jstar 可以启动它 -- 你会得到一个看起来像, 用起来
也像 WordStar 或是它的兄弟姊妹如 DOS editor 的编辑器;

lpr 可以在背景列印档案. 用 lpq 可查看在列印序列中排队的情形;

mc -- 一个很好用的 file manager;

pine , 一个不错的 e-mail 程式;

sudo 使一般使用者做某些 root 才能做的事 (像是 format 或是 mount .. RMP :p )

uname -a 会告诉你系统目前的状况;

zcat 和 zless 可以帮助你阅读被 gzip 压缩的文字档 - 却不用先将它解压.
$ zless textfile.gz
$ zcat textfile.gz | lpr

6.6. 常用的档案, 与它们的延伸名称, 相关程式

在 Linux 里你会遇到许多型式的档案 -- 它们都有不同的延伸名称. 以下是一个大
略的列表:

..1 ... .8: Manual Pages, 由 man 来读取.

..arj: arj 产生的压缩档.

..dvi: TeX (後述) 产生的输出档. 用 xdvi 就可以阅读; dvips 可以用来将 .dvi
转换成 .ps 的 postscript 档.

..gif: 图型档. 用 seejpeg 或是 xpaint.

..gz: gzip 的压缩档.

..info: info 档 ( man page 的一种型式). 由 info 来读取.

..jpg,.jpeg: 图型档. 使用 seejpeg.

..ps: postscript file. 用 gs , 或是 ghostview 来阅读. (great !!)

..tgz,.tar.gz: 由 tar 包装, 再由 gzip 压缩的档案.

..tex: 经过 TeX 处理的文字档, TeX 是一个强大的排版程式. 许多的 distributions
都附有 tex.

..texi: texinfo 档. (和 .info 类似). texinfo 使用之.

..xbm,.xpm,.xwd: 图形档. 用 xpaint.

..zip: 由 zip 压缩包装的档案, 请使用 zip 和 unzip.

..Z: 由 compress 压缩的档案.


剧终 -- 现在...

恭喜你!! 你已经对 Un*x 有了最初步的认识, 而可以准备用 Un*x 来进行更多的工作了.
但仍要提醒你, 这样仍然不够, 你仍然需要多一点 Linux 的使用及尝试的磨链. 不过,
如果你只不过是要使用一些应用程式, 那麽以上的讨论我猜已经足够了..:) 虽然我现在
仍然对 Linux 懂得不多, 但是 Linux 已经可以帮我处理许多每天必需的工作了!

我相信你一定会迷上 Linux , 进而更进一步的学息它 - 每个人都这样的. 我猜,
有了 Linux , 你一定不会想念 DOS ! 虽然我并不敢奢望有太多的读者, 但我仍深切
的希望能够对阅读本文的读者有所帮助 :)

Disclaimer


"From DOS to Linux - Quick!" was written by Guido Gonzato,
, April 1996. Many thanks to Matt Welsh, the author
of "Linux Installation and Getting Started", to Ian Jackson, the author of
"Linux frequently asked questions with answers", to Giuseppe Zanetti, the
author of "Linux - Il sistema operativo FREE SOFTWARE per personal computer
386/486", to all the folks who emailed me suggestions, and especially to
Linus Torvalds and GNU who gave us Linux.

This document is provided "as is". I put great effort into writing it as
accurately as I could, but you use the information contained in it at your
own risk. In no event shall I be liable for any damages resulting from the
use of this work.


This document can be freely distributed as long as:

- - it is distributed in its entirety, including this disclaimer and
permission notice;
- - no money is charged for it;
- - it is not modified in any way without my permission.

Translations, prints, re-editings, or extractions from this document must
be approved by me before being distributed. For any requests, suggestions,
flames, etc., feel free to contact me. If you don't have e-mail access, my
snail-mail address is:

Guido Gonzato - Via Monte Ortigara 19/a, 37127 Verona - Italy

Enjoy life!

Guido =8-)

中译感言

看了这麽多前辈们累积的心血, 心中总是有点不安.. 偶然间有这个机会做一点翻译的
工作, 还是万万不足以表答小弟心中对前辈们的感谢..
希望这篇文章能够对您有所帮助. 小弟第一次从事翻译的工作, 谬误在所难免.
关於本文的译文若是您有任何的疑问或是建议, 您可以到 freebsd.ee.ntu.edu.tw 的
Interpret 板讨论, 或是 e-mail
b84089@cctwin.ee.ntu.edu.tw 或
mglow.bbs@bbs.ee.ntu.edu.tw 告诉我, 小弟一定会尽力给予满意的答覆..
另外, 本文尽可在 TANet 上流传而不需作者(就是我啦)的同意.. 但如欲移作商业用途,
还是请先知会一下..:)

mglow.bbs@bbs.ee.ntu.edu.tw
on 970211