从 VMS 到 Linux HOWTO

作者:Guido Gonzato, , 和 Mike Miller,

版本:v1.1.4, 2004 年 9 月 22 日

本 HOWTO 旨在帮助所有使用过 VMS 现在需要或想要切换到 Linux(免费的 UNIX 克隆系统)的人。通过命令和可用工具之间的逐步比较,过渡过程(有望)变得轻松。


目录
1. 简介
1.1. 为什么选择 Linux?
1.2. 比较命令和文件
2. 简短介绍
2.1. 文件
2.2. 目录
2.3. 程序
2.4. 快速浏览
3. 编辑文件
4. TeX 排版
5. 编程
5.1. Fortran
5.2. 使用 make
5.3. Shell 脚本
5.4. C
6. 图形
7. 邮件和互联网工具
8. 高级主题
8.1. 权限和所有权
8.2. 多任务处理:进程和作业
8.3. 文件,再议
8.4. 打印队列
9. 配置
10. 实用程序
10.1. 浏览文件: less
10.2. Linux 下的编号备份
10.3. 归档:tar & gzip
11. 实际例子
12. 不可或缺的技巧
13. 从 Linux 读取 VMS 磁带
13.1. 简介
13.2. 基础知识
13.3. 一些细节
13.4. 关于块大小的评论
14. 结束语
14.1. 版权
14.2. 免责声明

1. 简介

1.1. 为什么选择 Linux?

您听说过 UNIX 很困难,并且不愿离开 VMS,是吗?别担心。Linux 是 UNIX 的优秀克隆系统之一,使用起来并不比 VMS 更困难;实际上,我发现它更容易。尽管 VMS 爱好者可能不同意,但在许多人看来,Linux 更强大且用途更广泛。

Linux 和 VMS 都是优秀的操作系统,并且基本上可以完成相同的任务,但是 Linux 具有一些使其成为 VMS 的良好替代方案的功能。此外,Linux 可用于 PC,而 VMS 则不能,并且现代基于奔腾的 Linux 机器可以胜过 VAX。锦上添花的是现代视频卡的出色性能,它将基于 X11 的 Linux 盒子变成了一个快速图形工作站;几乎总是比专用机器更快。

我想象您是一位大学研究人员或学生,并且您将 VMS 用于以下日常任务

  • 使用 TeX/LaTeX 撰写论文;

  • 用 Fortran 编程;

  • 进行一些图形处理;

  • 使用互联网服务;

  • 等等。

在以下各节中,我将向您解释如何在 Linux 下执行这些任务,同时利用您在 VMS 方面的经验。先决条件

  • Linux 和 X Window System 已正确安装;

  • 有系统管理员负责处理技术细节(请向他们寻求帮助,而不是向我寻求帮助 ;-) ;

  • 您的 shell(相当于DCL)是bash(询问您的系统管理员)。

请注意,本 HOWTO 不足以让您完全了解 Linux:它仅包含您入门所需的最低限度的知识。您应该更多地了解 Linux,以便充分利用它(高级bash功能,编程,正则表达式...)。从现在开始,RMP 的意思是“请阅读手册页以获取更多详细信息”。手册页相当于命令HELP.

Linux 文档项目文档可在 上获得,是一个重要的信息来源。我建议您阅读 Larry Greenfield 的“Linux 用户指南”---对于新手用户来说,它是非常宝贵的。

现在,开始吧。


1.2. 比较命令和文件

本表尝试比较 VMS 和 Linux 最常用的命令。请记住,语法通常非常不同;有关更多详细信息,请参阅以下各节。

VMS				Linux			Notes
------------------------------------------------------------------------------

@COMMAND                        command                 must be executable
COPY file1 file2                cp file1 file2
CREATE/DIR [.dirname]           mkdir dirname		only one at a time
CREATE/DIR [.dir1.dir2]         mkdirhier dir/name
DELETE filename                 rm filename
DIFF file1 file2                diff -c file1 file2
DIRECTORY                       ls
DIRECTORY [...]file		find . -name file
DIRECTORY/FULL                  ls -al
EDIT filename                   vi filename,            you won't like it
                                emacs filename,         EDT compatible
                                jed filename            ditto---my favourite
FORTRAN prog.for                g77 prog.f,             no need to do LINK
				f77 prog.f,
                                fort77 prog.f
HELP command                    man command             must specify `command'
                                info command            ditto
LATEX file.tex                  latex file.tex
LOGIN.COM                       .bash_profile,          `hidden' file
				.bashrc                 ditto
LOGOUT.COM                      .bash_logout            ditto
MAIL                            mail,                   crude
				elm,                    much better
				pine                    better still
				mutt                    ditto
PRINT file.ps                   lpr file.ps
PRINT/QUEUE=laser file.ps	lpr -Plaser file.ps
PHONE user                      talk user
RENAME file1 file2              mv file1 file2          not for multiple files
RUN progname                    progname
SEARCH file "pattern"           grep pattern file
SET DEFAULT [-]                 cd ..
SET DEFAULT [.dir.name]         cd dir/name
SET HOST hostname               telnet hostname,        not exactly the same
                                rlogin hostname
SET FILE/OWNER_UIC=joe		chown joe file          completely different
SET NOBROADCAST                 mesg
SET PASSWORD                    passwd
SET PROT=(perm) file		chmod perm file         completely different
SET TERMINAL                    export TERM=            different syntax
SHOW DEFAULT                    pwd
SHOW DEVICE                     du, df
SHOW ENTRY                      lpq
SHOW PROCESS                    ps -ax
SHOW QUEUE                      lpq
SHOW SYSTEM                     top
SHOW TIME                       date
SHOW USERS                      w
STOP                            kill
STOP/QUEUE                      kill,                   for processes
                                lprm                    for print queues
SUBMIT command                  command &
SUBMIT/AFTER=time command       at time command
TEX file.tex                    tex file.tex
TYPE/PAGE file                  more file
				less file               much better

当然,这不仅仅是命令名称不同的问题。请继续阅读。


2. 简短介绍

这是您第一次登录之前绝对需要知道的。放松,不多。


2.1. 文件

  • 在 VMS 下,文件名采用以下形式filename.extension;version。在 Linux 下,版本号不存在(很大的限制,但请参阅第 10.2 节);文件名通常限制为 255 个字符,并且可以有任意数量的点。文件名示例This.is_a_FILEname.txt.

  • Linux 区分大小写字符FILENAME.txtfilename.txt是两个不同的文件;ls是一个命令,LS不是。

  • 以点开头的文件是一个“隐藏”文件(也就是说,它通常不会在目录列表中显示),而以波浪号“~”结尾的文件代表备份文件。

现在,有一个表总结了如何将命令从 VMS 转换为 Linux

VMS					Linux
---------------------------------------------------------------------

$ COPY file1.txt file2.txt              $ cp file1.txt file2.txt
$ COPY [.dir]file.txt []                $ cp dir/file.txt .
$ COPY [.dir]file.txt [-]               $ cp dir/file.txt ..
$ DELETE *.dat;*                        $ rm *dat
$ DIFF file1 file2                      $ diff -c file1 file2
$ PRINT file                            $ lpr file
$ PRINT/queue=queuename file            $ lpr -Pprintername file
$ SEARCH *.tex;* "geology"              $ grep geology *tex

有关涉及目录的其他示例,请参见下文;有关保护,所有权和高级主题的详细信息,请参见第 8 节


2.2. 目录

  • 在同一节点和设备中,VMS 下的目录名称采用以下形式[top.dir.subdir];在 Linux 下,/top/dir/subdir/。目录树的顶部是所谓的“根目录”,称为/;下面还有其他目录,例如/bin, /usr, /tmp, /etc等等。

  • 目录/home包含所谓的用户的“主目录”:例如/home/guido, /home/warner等等。当用户登录时,他们开始在其主目录中工作;这相当于SYS$LOGIN。主目录有一个快捷方式:波浪号“~~”。所以,cd ˜/tmp与,例如,.

  • cd /home/guido/tmp.目录名称遵循与文件名相同的规则。此外,每个目录都有两个特殊的条目:一个是[],指的是目录本身(如..),以及[-]).

,指的是父目录(如

VMS                                     Linux
---------------------------------------------------------------------

$ CREATE/DIR [.dirname]                 $ mkdir dirname
$ CREATE/DIR [.dir1.dir2.dir3]          $ mkdirhier dir1/dir2/dir3
   n/a                                  $ rmdir dirname
   					(if dirname is empty)
                                        $ rm -R dirname
$ DIRECTORY                             $ ls
$ DIRECTORY [...]file.*;*		$ find . -name "file*"
$ SET DEF SYS$LOGIN			$ cd
$ SET DEF [-]                           $ cd ..
$ SET DEF [top.dir.subdir]              $ cd /top/dir/subdir
$ SET DEF [.dir.subdir]                 $ cd dir/subdir
$ SHOW DEF                              $ pwd

现在来看一些其他示例


有关保护,所有权和高级主题,请参见第 8 节

  • 2.3. 程序命令、编译的程序和 shell 脚本(VMS 的“命令文件”)没有像.EXE.COM*那样的强制性扩展名,并且可以随意调用。当您发出ls -F.

  • 时,可执行文件会用星号“”标记。要运行可执行文件,只需键入其名称(无需.EXERUN PROGRAM.EXE@COMMAND/bin, )。注意:至关重要的是,该文件必须位于包含在可执行文件路径中的目录中,该路径是一个目录列表。通常,该路径包括诸如, /usr/bin/usr/X11R6/bin之类的目录。如果您编写自己的程序,请将它们放在已包含在路径中的目录中(请参阅第 9 节中的说明)。作为替代方法,您可以指定其完整路径来运行程序:例如,/home/guido/data/myprog;或者./myprog

  • ,如果当前目录不在路径中。命令开关通过/OPTION=在 VMS 下获得,并通过.EXE-switch--switch在 Linux 下获得,其中switch是一个字母,更多字母的组合或一个单词。特别是,许多 Linux 命令的开关-R[...](递归)执行与

  • 在 VMS 下相同的操作;

    $ command1 ; command2 ; ... ; commandn

  • 您可以在命令行上发出多个命令Linux 的大部分灵活性来自 VMS 中笨拙地实现或缺失的两个功能:I/O 重定向和管道。(我听说 DCL 的最新版本支持重定向和管道,但我没有该版本。)重定向是 VMS 下的辅助功能(记住许多命令的开关/OUTPUT=

    $ DEFINE /USER SYS$OUTPUT OUT 
    $ DEFINE /USER SYS$INPUT IN
    $ RUN PROG
    ),或一个冗长的过程,例如
    $ prog < in > out
    ,它具有简单的 Linux (UNIX) 等效项
    $ myprog < datafile | filter_1 | filter_2 >> result.dat 2> errors.log &
    管道在 VMS 下不容易获得,但在 UNIX 下起着关键作用。一个典型的例子这意味着:程序myprog从文件datafile<(通过|)获取其输入,其输出通过管道(通过)传输到程序filter_1,该程序将其作为输入并进行处理,生成的输出再次通过管道传输到filter_2>>以进行进一步处理,最终输出附加(通过)到文件result.dat2>,错误消息被重定向(通过)到文件errors.log&。所有这些都在后台(

在命令行末尾)。有关此内容的更多信息,请参见第 11 节


有关多任务处理,“队列”等,请参见第 8 节

2.4. 快速浏览现在,您已准备好试用 Linux。完全按照输入您的登录名和密码。例如,如果您的登录名和密码是johnMy_PassWd请勿输入.EXEJohnmy_passwd

。请记住,UNIX 区分大小写。登录后,您将看到一个提示符;很可能类似于machinename:$。如果要更改提示符或使某些程序自动启动,则必须编辑一个“隐藏”文件,称为.EXE.profile.bash_profile(请参见第 9 节中的示例)。这相当于.

LOGIN.COM

按 ALT--F1、ALT--F2、... ALT--F6 可以在“虚拟控制台”之间切换。当一个 VC 忙于全屏应用程序时,您可以翻转到另一个并继续工作。尝试登录到另一个 VC。现在,您可能要启动 X Window System(从现在开始,简称 X)。X 是一个非常类似于 DECWindows 的图形环境---实际上,后者是从前者派生的。键入命令startx并等待几秒钟;很可能会看到一个打开的xterm

或等效的终端仿真器,以及一个按钮栏。(这取决于您的系统管理员如何配置您的 Linux 盒子。)单击桌面(尝试鼠标的左右键)以查看菜单。

在 X 中时,要访问文本模式(“控制台”)会话,请按 CTRL--ALT--F1 ... CTRL--ALT--F6。试试看。在控制台中时,按 ALT--F7 返回 X。要退出 X,请按照菜单说明或按 CTRL--ALT--BS。

$ ls -al

键入以下命令以列出您的主目录内容,包括隐藏文件ls按 SHIFT--PAG UP 向后滚动。现在获取有关

$ man ls

按下 'q' 键退出。要结束本次游览,输入exit来结束您的会话。如果您现在想关闭您的电脑,请按下 CTRL--ALT--DEL 并等待几秒钟(千万不要在 Linux 中直接关闭电脑! 否则您可能会损坏文件系统。)

如果您认为您已准备好开始工作,请继续,但如果我是您,我会跳转到 第 8 节


3. 编辑文件

Linux 没有EDT,但有很多可用的编辑器。唯一能保证包含在每个 UNIX 版本中的是vi---忘了它吧,您的系统管理员肯定安装了一些更好的东西。可能最流行的编辑器是emacs,它可以一定程度上模拟EDTjed是另一个提供EDT模拟的编辑器。

这两个编辑器对于编辑程序源代码特别有用,因为它们具有EDT未知的两个特性:语法高亮和自动缩进。此外,您可以从编辑器中编译您的程序 (命令ESC-X compile);如果出现语法错误,光标将定位在出错的行上。我敢打赌您再也不想使用真正的EDT了。

如果您有emacs:启动它,然后输入ESC-X edt-emulation-on。按下 ALT--X 或 ESC-X 是emacs发出命令的方式,就像EDT的 CTRL--Z 一样。从现在开始,emacs的行为就像EDT,除了几个命令。区别在于

如果您有jed:让您的系统管理员正确配置jed。当您启动它时,模拟已经启动;使用普通的数字键盘键,然后按 CTRL--H CTRL--H 或 CTRL-? 来获取帮助。命令的发出方式与emacs相同。此外,还有一些在原始EDT中缺失的方便的键绑定;键绑定也可以根据您自己的喜好进行定制。询问您的系统管理员。

或者,您可以使用另一个具有完全不同界面的编辑器。emacs在原生模式下是一个明显的选择;另一个流行的编辑器是joe,它可以模拟其他编辑器,例如emacs自身 (甚至更容易使用) 或 DOS 编辑器。调用编辑器如下jmacs.EXEjstar并分别按下 CTRL-X H 或 CTRL-J 来获取在线帮助。emacsjed比旧的EDT.


4. TeXing

TeX 和 LaTeX 与它们的 VMS 对应物相同---只是更快 :-),但是处理.dvi.ps文件的工具更强大


5. 编程

在 Linux 下编程要好得多:有很多工具可以使编程更容易和更快。例如,通过使用诸如emacs.EXEjed之类的编辑器,可以缩短编辑-保存-退出-编译-重新编辑的繁琐过程,如上所示。


5.1. Fortran

这里没有实质性的差异,但请注意,在撰写本文时,可用的(免费)编译器与 VMS 的兼容性不是 100%;预计会出现一些小问题。(实际上是 VMS 编译器具有非标准扩展。) 请参阅/usr/doc/g77/DOC.EXE/usr/doc/f2c/f2c.ps以获取详细信息。

您的系统管理员已安装了一个名为g77(很好,但截至 0.5.21 版本,与 DEC Fortran 的兼容性仍然不完美) 的原生编译器,或者可能是 Fortran 到 C 的翻译器,f2c,以及使其模仿原生编译器的前端之一。根据我的经验,软件包yaf77提供了最佳结果。

要使用g77编译 Fortran 程序,编辑源代码,将其保存为扩展名为.f,然后执行

$ g77 myprog.f

,默认情况下会创建一个名为a.out的可执行文件(您不必链接任何内容)。要给可执行文件一个不同的名称并进行一些优化

$ g77 -O2 -o myprog myprog.f

注意优化!请您的系统管理员阅读编译器附带的文档,并告诉您是否存在任何问题。

要编译一个子程序

$ g77 -c mysub.f

这将创建一个文件mysub.o。要将此子程序链接到程序,您将执行

$ g77 -o myprog myprog.f mysub.o

如果您有许多外部子程序,并且想要创建一个库,请执行以下操作

$ cd subroutines/
$ cat *f >mylib.f ; g77 -c mylib.f

这将创建mylib.o,您可以将其链接到您的程序。

最后,要链接一个名为,例如,libdummy.so:

$ g77 -o myprog myprog.f -ldummy

如果您有f2c的外部库,您只需要使用f77.EXEfort77而不是g77.

另一个有用的编程工具是make,如下所述。


5.2. 使用make

实用程序make是一个用于处理分成多个源文件的程序的编译的工具。 VMS 对应物是MMSMMK,它们具有不同的语法。

假设您有包含您的例程的源文件,file_1.f, file_2.f, file_3.f,以及使用这些例程的主程序的源文件,myprog.f。如果您手动编译您的程序,每当您修改其中一个源文件时,您必须找出哪个文件依赖于哪个文件,哪个文件首先要重新编译,等等。

与其生气,不如编写一个“makefile”。这是一个包含您的源文件之间依赖关系的文本文件:当一个文件被修改时,只会重新编译那些依赖于已修改的文件。

在我们的示例中,您将编写一个如下所示的 makefile

# This is makefile
# Press the <TAB> key where you see <TAB>!
# It's important: don't use spaces instead.

myprog: myprog.o file_1.o file_2.o file_3.o
<TAB>g77 -o myprog myprog.o file_1.o file_2.o file_3.o
# myprog depends on four object files

myprog.o: myprog.f
<TAB>g77 -c myprog.f
# myprog.o depends on its source file

file_1.o: file_1.f
<TAB>g77 -c file_1.f
# file_1.o depends on its source file

file_2.o: file_2.f file_1.o
<TAB>g77 -c file_2.f file_1.o
# file_2.o depends on its source file and an object file

file_3.o: file_3.f file_2.o
<TAB>g77 -c file_3.f file_2.o
# file_3.o depends on its source file and an object file

# end of makefile.

将此文件保存为Makefile并输入make来编译您的程序;或者,将其保存为myprog.mak并输入make -f myprog.mak。当然,还有 RMP。


5.3. Shell 脚本

Shell 脚本相当于 VMS 的命令文件,并允许使用非常强大的结构。

要编写一个脚本,您所要做的就是编写一个包含命令的标准 ASCII 文件,保存它,然后使用命令使其可执行chmod +x <scriptfile>。要执行它,请输入它的名称。

bash下编写脚本是一个非常广泛的主题,它本身就需要一本书,我不会再深入探讨这个话题。我只是给您一个或多或少全面且(希望)有用的示例,您可以从中提取一些基本规则。

示例:sample.sh

#!/bin/sh
# sample.sh
# I am a comment
# don't change the first line, it must be there
echo "This system is: `uname -a`" # use the output of the command
echo "My name is $0" # built-in variables
echo "You gave me the following $# parameters: "$*
echo "First parameter is: "$1
echo -n "What's your name? " ; read your_name
echo notice the difference: "hi $your_name" # quoting with "
echo notice the difference: 'hi $your_name' # quoting with '
DIRS=0 ; FILES=0
for file in `ls .` ; do
  if [ -d ${file} ] ; then # if file is a directory
    DIRS=`expr $DIRS + 1`  # this means DIRS = DIRS + 1
  elif [ -f ${file} ] ; then
    FILES=`expr $FILES + 1`
  fi
  case ${file} in
    *.gif|*jpg) echo "${file}: graphic file" ;;
    *.txt|*.tex) echo "${file}: text file" ;;
    *.c|*.f|*.for) echo "${file}: source file" ;;
    *) echo "${file}: generic file" ;;
  esac
done
echo "there are ${DIRS} directories and ${FILES} files"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # exit code of last command
  echo "ZxY--!!!WKW not found"
fi
echo "enough... type 'man bash' if you want more info."


5.4. C

Linux 是一个用 C 编程的绝佳环境。假设您了解 C,这里有一些指南。要编译您的标准hello.c,您将使用gcc编译器,它是 Linux 的一部分,并且具有与g77:

$ gcc -O2 -o hello hello.c

相同的语法。要将库链接到程序,请添加开关-l<libname>。例如,要链接数学库并进行优化,请执行

$ gcc -O2 -o mathprog mathprog.c -lm

(-l<libname>开关强制gcc链接库/usr/lib/lib<libname>.a;所以-lm链接/usr/lib/libm.a).

当您的程序由多个源文件组成时,您将需要使用实用程序make,如上所述。只需在 makefile 中使用gcc和 C 源文件即可。

您可以调用一些关于 C 函数的帮助,这些函数由 man 页面第 3 节涵盖;例如,

$ man 3 printf

那里有很多可用的库;您首先要使用的是ncurses,用于处理文本模式效果,以及svgalib,用于进行图形。


6. 图形

在众多可用的图形软件包中,gnuplot以其强大的功能和易用性而脱颖而出。转到 X 并输入gnuplot,并准备好两个示例数据文件2D-data.dat(每行两个数据),以及3D-data.dat(每行三个数据)。

2-D 图表的示例

gnuplot> set title "my first graph"
gnuplot> plot '2D-data.dat'
gnuplot> plot '2D-data.dat' with linespoints
gnuplot> plot '2D-data.dat', sin(x)
gnuplot> plot [-5:10] '2D-data.dat'

3-D 图表的示例 (每个 X 值的 “行” 后面都跟着一个空行)

gnuplot> set parametric ; set hidden3d ; set contour
gnuplot> splot '3D-data.dat' using 1:2:3 with linespoints

一个单列数据文件 (例如,一个时间序列) 也可以绘制成一个 2-D 图表

gnuplot> plot [-5:15] '2D-data-1col.dat' with linespoints

或绘制成一个 3-D 图表 (数据文件中包含空行,如上所述)

gnuplot> set noparametric ; set hidden3d
gnuplot> splot '3D-data-1col.dat' using 1 with linespoints

要打印一个图表:如果您的 Postscript 打印机上的打印命令是lpr -Pps file.ps,发出

gnuplot> set term post
gnuplot> set out '| lpr -Pps'
gnuplot> replot

然后输入set term x11来恢复。不要感到困惑---只有当您退出gnuplot.

时,最后的打印才会出来。要了解更多信息,请输入help或查看目录/usr/lib/gnuplot/demos/


中的示例,如果您有的话。

7. 邮件和 Internet 工具


8. 高级主题

在这里,游戏变得艰难。学习这些特性,那么您就可以说您“了解一些关于 Linux 的知识”了 ;-)


8.1. 权限和所有权

就像在 VMS 下一样,文件和目录具有权限(“保护”)和所有权。如果您无法运行程序、无法修改文件或无法访问目录,那是因为您没有执行这些操作的权限,或者因为该文件不属于您。让我们看下面的例子

$ ls -l /bin/ls
-rwxr-xr-x   1 root     bin         27281 Aug 15  1995 /bin/ls*

第一个字段显示文件的权限ls(所有者 root,组 bin)。有三种类型的所有权:所有者、组和其他人(类似于 VMS 的所有者、组、世界),以及三种类型的权限:读取、写入(和删除)和执行。

从左到右,-是文件类型(-= 普通文件,d= 目录,l= 链接,等等);rwx是文件所有者的权限(读取、写入、执行);r-x是文件所有者所属组的权限(读取、执行);r-x是所有其他用户的权限(读取、执行)。

要更改文件的权限

$ chmod <whoXperm> <file>

其中 who 是u(用户,即所有者),g(组),o(其他人),X 要么是+.EXE-,perm 是r(读取),w(写入),或者x(执行)。例子

$ chmod u+x file

这将设置文件所有者的执行权限。快捷方式chmod +x 文件.

$ chmod go-wx file

这将删除除所有者之外的所有人的写入和执行权限。

$ chmod ugo+rwx file

这将赋予所有人读取、写入和执行权限。

引用权限的一种更短的方法是使用数字rwxr-xr-x可以表示为 755(每个字母对应一个位---是 0,--x是 1,-w-是 2...)。

对于目录,rx意味着您可以cd到该目录,以及w意味着您可以删除目录中的文件(当然,根据文件的权限),或者删除目录本身。所有这些只是其中的一部分---RMP。

要更改文件的所有者

$ chown username file

总而言之,一张表

VMS				Linux			Notes
------------------------------------------------------------------------------

SET PROT=(O:RW) file.txt	$ chmod u+rw file.txt
				$ chmod 600 file.txt
SET PROT=(O:RWED,W) file	$ chmod u+rwx file
				$ chmod 700 file
SET PROT=(O:RWED,W:RE) file	$ chmod 755 file
SET PROT=(O:RW,G:RW,W) file	$ chmod 660 file
SET FILE/OWNER_UIC=JOE file	$ chown joe file
SET DIR/OWNER_UIC=JOE [.dir]	$ chown joe dir/


8.2. 多任务处理:进程和作业

更多关于运行程序的信息。Linux 下没有像您习惯的那样的“批处理队列”;多任务处理的处理方式非常不同。同样,这是典型的命令行外观

$ command -s1 -s2 ... -sn par1 par2 ... parn < input > output &

其中-s1, ..., -sn是程序开关,par1, ..., parn是程序参数。

现在让我们看看多任务处理是如何工作的。在前台或后台运行的程序称为“进程”。

  • 要在后台启动一个进程

    $ progname [-switches] [parameters] [< input] [> output] &
    [1] 234
    shell 会告诉您该进程的“作业编号”(第一个数字;见下文)和 PID(进程标识符)。每个进程都由其 PID 标识。

  • 要查看有多少个进程

    $ ps -ax
    这将输出一个当前正在运行的进程列表。

  • 要杀死一个进程

    $ kill <PID>
    当您不知道如何正确退出进程时,可能需要杀死它... ;-)。有时,一个进程只能通过以下方式之一杀死
    $ kill -15 <PID>
    $ kill -9 <PID>

除此之外,shell 允许您停止或临时挂起一个进程,将进程发送到后台,以及将进程从后台带到前台。在这种情况下,进程被称为“作业”。

  • 要查看有多少个作业

    $ jobs
    作业由 shell 给它们的编号标识,而不是由它们的 PID 标识。

  • 要停止在前台运行的进程

    $ CTRL-C
    (它并不总是有效)

  • 要暂停在前台运行的进程

    $ CTRL-Z
    (同上)

  • 要将暂停的进程发送到后台(它变成一个作业)

    $ bg <job>

  • 要将作业带到前台

    $ fg <job>

  • 要杀死一个作业

    $ kill <%job>


8.3. 文件,重新审视

更多关于文件的信息。

  • stdin, stdout, stderr:在 UNIX 下,每个系统组件都被视为文件。命令和程序从名为stdin(标准输入;通常是键盘)的“文件”获取输入,将其输出放在名为stdout(通常是屏幕)的“文件”上,并将错误消息发送到名为stderr(通常是屏幕)的“文件”。使用<>您可以将输入和输出重定向到不同的文件。此外,>>将输出附加到文件而不是覆盖它;2>重定向错误消息 (stderr);2>&1 将 stderr 重定向到 stdout,而 1>&2 将 stdout 重定向到 stderr。有一个“黑洞”叫做/dev/null: 重定向到它的任何东西都会消失;

  • 通配符: '*几乎相同。用法:* 匹配除隐藏文件之外的所有文件;.* 匹配所有隐藏文件;*.* 只匹配中间有一个“.”的文件,后跟其他字符;p*r 匹配“peter”和“piper”;*c* 匹配“picked”和“peck”。%变为?。还有另一个通配符:[]。用法[abc]*匹配以 a、b、c 开头的文件;*[I-N,1,2,3]匹配以 I、J、K、L、M、N、1、2、3 结尾的文件;

  • mv (重命名) 不适用于多个文件;也就是说,mv *.xxx *.yyy不起作用;

  • 使用cp -imv -i在文件将被覆盖时收到警告。


8.4. 打印队列

您的打印作业像在 VMS 下一样排队。当您发出打印命令时,您可以指定打印机名称。例子

$ lpr file.txt          # this goes to the standard printer
$ lpr -Plaser file.ps   # this goes to the printer named 'laser'

要处理打印队列,您可以使用以下命令

VMS					Linux
------------------------------------------------------------------------------

$ PRINT file.ps				$ lpr file.ps
$ PRINT/QUEUE=laser file.ps		$ lpr -Plaser file.ps
$ SHOW QUEUE				$ lpq
$ SHOW QUEUE/QUEUE=laser       		$ lpq -Plaser
$ STOP/QUEUE				$ lprm <item>


9. 配置

您的系统管理员已经为您提供了一些配置文件,例如.xinitrc, .profile, .inputrc等等。您可能想要编辑的是

举例来说,我将包含我的.profile(节选)

# $HOME/.bash_profile

# don't redefine the path if not necessary
echo $PATH | grep $LOGNAME > /dev/null
if [ $? != 0 ]
then
  export PATH="$PATH:/home/$LOGNAME/bin"  # add my dir to the PATH
fi

export PS1='LOGNAME:\w\$ '
export PS2='Continued...>'

# aliases

alias bin="cd ~/bin" ; alias cp="cp -i" ; alias d="dir"
alias del="delete" ; alias dir="/bin/ls $LS_OPTIONS --format=vertical"
alias ed="jed" ; alias mv='mv -i'
alias u="cd .." ; alias undel="undelete"

# A few useful functions

inst() # Install a .tar.gz archive in current directory.
{
  gzip -dc $1 | tar xvf -
}
cz() # List the contents of a .zip archive.
{
  unzip -l $*
}
ctgz() # List the contents of a .tar.gz archive.
{
  for file in $* ; do
    gzip -dc ${file} | tar tf -
  done
}
tgz() # Create a .tgz archive a la zip.
{
  name=$1 ; tar -cvf $1 ; shift
  tar -rf ${name} $* ; gzip -S .tgz ${name}
}

这是我的.inputrc:

# $HOME/.inputrc
# Last modified: 16 January 1997.
#
# This file is read by bash and defines key bindings to be used by the shell;
# what follows fixes the keys END, HOME, and DELETE, plus accented letters.
# For more information, man readline.

"\e[1~": beginning-of-line
"\e[3~": delete-char
"\e[4~": end-of-line

set bell-style visible
set meta-flag On
set convert-meta Off
set output-meta On
set horizontal-scroll-mode On
set show-all-if-ambiguous On

# (F1 .. F5) are "\e[[A" ... "\e[[E"

"\e[[A": "info "


10. 有用的程序

10.1. 浏览文件less

您每天都会使用这个文件浏览器,所以我将给您一些技巧,以便最好地使用它。首先,请您的系统管理员配置less以便它不仅可以显示纯文本文件,还可以显示压缩文件、存档等等。

像最近的版本一样TYPE, less允许您双向浏览文件。它还接受一些通过按键发出的命令。最有用的是

  • 首先,按q退出浏览器;

  • h为您提供广泛的帮助;

  • g转到文件开头,G到文件末尾,数字+g转到第“数字”行(例如125g),数字+%移动到文件的该百分比;

  • /pattern向前搜索“pattern”;n向前搜索下一个匹配项;?patternN向后搜索;

  • m+字母标记当前位置(例如ma); '+字母转到标记的位置。

  • :e检查一个新文件;

  • !command执行 shell 命令。


10.2. Linux 下的编号备份

唉,Linux 仍然不支持文件版本号,但您可以通过两种方式克服此限制。第一种是使用 RCS,即修订控制系统,它允许您保留文件的先前版本。RCS 在 ``The RCS MINI-HOWTO'' 中介绍()。

第二种方法是使用知道如何处理编号备份的编辑器;emacsjed是可以的。在emacs中,在您的.emacs:

(setq version-control t)
(setq kept-new-versions 15) ;;; or any other value
(setq kept-old-versions 15)
(setq backup-by-copying-when-linked t)
(setq backup-by-copying-when-mismatch t)

jed中,确保您拥有 0.98.7 或更高版本;编号备份的补丁程序可在 .


10.3. 存档:tar & gzip

在 UNIX 下,有一些广泛使用的应用程序来存档和压缩文件。tar用于制作存档,即文件集合。要制作新的存档

$ tar -cvf <archive_name.tar> <file> [file...]

要从存档中提取文件

$ tar -xpvf <archive_name.tar> [file...]

要列出存档的内容

$ tar -tf <archive_name.tar> | less

可以使用以下命令压缩文件以节省磁盘空间compress,它已经过时,不应该再使用,或者gzip:

$ compress <file>
$ gzip <file>

,它创建一个带有扩展名 .Z (compress) 或 .gz (gzip) 的压缩文件。这些程序不制作存档,而是单独压缩文件。要解压缩,请使用

$ compress -d <file.Z>
$ gzip -d <file.gz>

RMP.

Theunarj, zipunzip实用程序也可用。带有扩展名.tar.gz.EXE.tgz(用tar存档,然后用gzip压缩)在 UNIX 世界中非常常见。以下是如何列出.tar.gz存档

$ tar -ztf <file.tar.gz> | less

要从.tar.gz存档

$ tar -zxf <file.tar.gz>


11. 真实示例

UNIX 的核心思想是,有许多简单的命令可以通过管道和重定向链接在一起,以完成甚至非常复杂的任务。看看下面的例子。我只会解释最复杂的那些;对于其他的,请学习上面的章节和手册页。

问题: ls太快了,文件名飞走了。

解决方案:

$ ls | less

问题:我有一个包含单词列表的文件。我想以相反的顺序排序并打印它。

解决方案:

$ cat myfile.txt | sort -r | lpr

问题:我的数据文件有一些重复的行!我如何摆脱它们?

解决方案:

$ sort datafile.dat | uniq > newfile.dat

问题:我有一个名为“mypaper.txt”或“mypaper.tex”的文件,或者类似的文件,但我忘了把它放在哪里。我该如何找到它?

解决方案:

$ find ~ -name "mypaper*" 

解释find是一个非常有用的命令,可以列出目录树中的所有文件(从~在这种情况下)。 它的输出可以被过滤以满足多个标准,例如-name.

问题: 我在一个目录中有一个包含 'entropy' 单词的文本文件,有什么类似SEARCH?

解决方案: 是的,试试

$ grep -l 'entropy' *

问题: 在某个地方我有一些包含单词 'entropy' 的文本文件,我想知道它们是哪些以及它们在哪里。在 VMS 下,我会使用search entropy [...]*.*;*, 但是grep不能递归子目录。现在怎么办?

解决方案:

$ find . -exec grep -l "entropy" {} \; 2> /dev/null

解释find .输出从当前目录开始的所有文件名,-exec grep -l "entropy"是对每个文件执行的操作(用{}), \终止命令。 如果你觉得这个语法很糟糕,你是对的。

作为替代方案,编写以下脚本

#!/bin/sh
# rgrep: recursive grep
if [ $# != 3 ]
then
  echo "Usage: rgrep --switches 'pattern' 'directory'"
  exit 1
fi
find $3 -name "*" -exec grep $1 $2 {} \; 2> /dev/null

解释grepsearch一样工作,并且将它与find结合起来,我们就可以获得两者的最佳效果。

问题: 我有一个数据文件,它有两行标题行,然后每行都有 'n' 个数据,不一定是等间距的。 我想要每行的第 2 个和第 5 个数据值。 我应该写一个 Fortran 程序吗?

解决方案: 不用。 这样更快

$ awk 'NL > 2 {print $2, "\t", $5}' datafile.dat > newfile.dat

解释:命令awk实际上是一种编程语言:对于datafile.dat中从第三行开始的每一行,打印出第二个和第五个字段,用制表符分隔。 学一些awk---它可以节省大量时间。

问题: 我下载了一个 FTP 站点的ls-lR.gz来检查它的内容。对于每个子目录,它包含一行显示 “total xxxx”,其中 xxxx 是目录内容的大小(以千字节为单位)。 我想获得所有这些 xxxx 值的总和。

解决方案:

$ zcat ls-lR.gz | awk ' $1 == "total" { i += $2 } END {print i}'

解释zcat输出.gz文件的内容,并管道传输到awk,恳请您阅读其手册页 ;-)

问题: 我写了一个 Fortran 程序,这意味着:程序,从一个数据文件计算一个参数。 我想在数百个数据文件上运行它,并得到一个结果列表,但每次都要求输入文件名很麻烦。 在 VMS 下,我会编写一个冗长的命令文件,而在 Linux 下呢?

解决方案: 一个非常简短的脚本。 让你的程序查找数据文件 'mydata.dat' 并在屏幕 (stdout) 上打印结果,然后编写以下脚本

#!/bin/sh
# myprog.sh: run the same command on many different files
# usage: myprog.sh *.dat
for file in $*  # for all parameters (e.g. *.dat)
do
  # append the file name to result.dat
  echo -n "${file}:    " >> results.dat
  # copy current argument to mydata.dat, run myprog 
  # and append the output to results.dat
  cp ${file} mydata.dat ; myprog >> results.dat
done

问题: 我想在我的所有文本文件中将“geology”替换为“geophysics”。 我要手动编辑它们吗?

解决方案: 不用。 编写这个 shell 脚本

#!/bin/sh
# replace $1 with $2 in $*
# usage: replace "old-pattern" "new-pattern" file [file...]
OLD=$1          # first parameter of the script
NEW=$2          # second parameter
shift ; shift   # discard the first 2 parameters: the next are the file names
for file in $*  # for all files given as parameters
do
# replace every occurrence of OLD with NEW, save on a temporary file
  sed "s/$OLD/$NEW/g" ${file} > ${file}.new
# rename the temporary file as the original file
  /bin/mv ${file}.new ${file}
done

问题: 我有一些数据文件,我不知道它们的长度,并且必须删除它们的倒数第二行和倒数第三行。 嗯... 手动操作?

解决方案: 当然不用。 编写这个脚本

#!/bin/sh
# prune.sh: removes n-1th and n-2th lines from files
# usage: prune.sh file [file...]
for file in $*   # for every parameter
do
  LINES=`wc -l $file | awk '{print $1}'`  # number of lines in file
  LINES=`expr $LINES - 3`                 # LINES = LINES - 3
  head -n $LINES $file > $file.new        # output first LINES lines
  tail -n 1 $file >> $file.new            # append last line
done

我希望这些例子能引起您的兴趣...


12. 您不可或缺的技巧


13. 从 Linux 读取 VMS 磁带

(本节由 Mike Miller 编写)


13.1. 介绍

有时您可能想读取在 VMS 机器上制作的磁带(或制作成可被 VMS 和 *nix 系统读取的磁带)。 一般来说,对于 DECFILES11A 磁带来说,这非常容易。

虽然您可能正在阅读本文作为 Linux mini-HOWTO 的一部分,但我相信这里的信息适用于任何 *nix 系统 - 我已经在 Linux、HP、Sun 和 DEC *nix 系统上完成了这项工作。 我知道的主要平台依赖是设备名称,它们在不同的系统上可能不同,以及 mt 中用于指定设备名称的选项(例如,Linux 上的 mt -f 和 HPUX 9 上的 mt -t)。

注意 - 我只尝试过 Exabyte 8mm SCSI 磁带驱动器。 如果您读取了其他格式(仍然有那些 9 轨磁带吗?),请告诉我,我会在此处添加注释。


13.2. 基础知识

在读取使用 VMS ``copy'' 命令制作的磁带(或者至少制作成看起来像是使用 copy 制作的)时,您需要知道的是,对于每个实际数据文件,磁带上将有三个文件 - 一个标头、数据和一个尾部。 标头和尾部很有趣,因为它们包含文件在 VMS 下存在时的信息。 数据就是数据。 这些文件中的每一个都可以使用 dd 命令从磁带中提取。 可以通过使用 mt 命令跳过来进行磁带定位。

示例:我有一盘 VMS 磁带,上面有一系列文件。 前两个文件最初在 VMS 系统上命名为 ce66-2.evt 和 ce66-3.evt。 磁带标签是 c66a2。

如果我执行这些命令

> dd if=$TAPE bs=16k of=header1
> dd if=$TAPE bs=16k of=data1
> dd if=$TAPE bs=16k of=trailer1
> dd if=$TAPE bs=16k of=header2
> dd if=$TAPE bs=16k of=data2
> dd if=$TAPE bs=16k of=trailer2

我将得到六个文件:header1、data1、trailer1、header2、data2 和 trailer2。这里的语法是 if="输入文件",bs="块大小" 和 of="输出文件"。 TAPE 应该是一个包含您的磁带驱动器的设备名称的变量 - 例如,如果您使用的是 Linux 上的第一个 SCSI 磁带,则为 /dev/nts0。

如果你想读取第二个文件,但不想读取第一个文件,你不在乎标头,并且你想使用原始文件名,请这样做

> mt -f $TAPE fsf 4
> dd if=$TAPE bs=16k of=ce66-2.evt
> mt -f $TAPE fsf 1

注意 4 - 跳过三个文件以获取磁带上的第一个文件,然后跳过一个文件以获取下一个标头。 第二个 mt 跳过第二个文件的尾部,并将磁带定位到下一个文件的开头 - 第三个 VMS 标头。 您也可以使用 mt 向后跳过 (bsf)、倒带 (rewind) 以及倒带和卸载磁带 (offline, rewoffl)。


13.3. 细节

标头和尾部文件包含 VMS 用于存储文件信息的 ASCII 大写数据,例如块大小。 它们还包含文件名,如果您想构建自动读取文件或搜索特定文件的脚本,这会很方便。 磁带卷上的第一个标头与后续标头略有不同。

对于作为磁带上的第一个文件的文件,如上述示例中的 header1,前四个字符将是 "VOL1",后跟卷名。 在示例中,header1 以 "VOL1C66A2" 开头。 接下来是一系列以数字结尾的空格。 之后是字符串 "HDR1",表示这是一个文件标头。 紧随 HDR1 字符串之后的字符是 VMS 文件名。 在示例中,这是 "HDR1CE66-2.EVT"。 下一个字段再次是卷名。

对于不是磁带上的第一个文件的文件,不存在初始 VOL1 字段。 除此之外,标头的结构与初始文件相同。 另一个有用的字段是第 7 个字段,它将以 "DECFILES11A" 结尾。 在符合 DEC Files11A 标准的磁带上,必须存在此字段。

       field	 initial header		subsequent headers
       =====	 =============		==================
         1	 VOL1 + volume name	HDR1 + file name
         2	 3HDR1 + file name	volume name
         3	 volume name		

         6				...DECFILES11A
	 7	...DECFILES11A

有关标头和尾部格式的完整详细信息,请参见 DEC FILES11A 文档(在橙色/灰色墙上 - 询问您当地的 VMS 人员 :-)。


13.4. 关于块大小的评论

在示例中,我使用了 16k 的块大小。 在 *nix 系统上,磁盘上的文件没有与其关联的块大小,而在 VMS 下,每个文件都有一个特定的块大小。 这意味着块大小在 Linux 端并不太重要...... 除非它使读取磁带变得困难。 如果您在确定块大小和读取磁带时遇到困难,您可以尝试使用 `mt -f $TAPE setblk 0' 在磁带驱动器上设置硬件块大小。 setblk 选项的确切形式(及其可用性)可能取决于 mt 的版本、磁带驱动器硬件接口以及您的特定 *nix 版本。

(感谢 Wojtek Skulski () 指出了 setblk。)


14. 结尾

14.1. 版权

除非另有说明,Linux HOWTO 文档由其各自的作者拥有版权。 只要在所有副本上保留此版权声明,Linux HOWTO 文档可以整体或部分地以任何物理或电子媒介复制和分发。 允许并鼓励商业再分发; 但是,作者希望收到有关任何此类分发的通知。

包含任何 Linux HOWTO 文档的所有翻译、衍生作品或聚合作品都必须在此版权声明下涵盖。 也就是说,您不得从 HOWTO 中生成衍生作品并对其分发施加其他限制。 在某些情况下可以授予对这些规则的例外; 请通过以下地址联系 Linux HOWTO 协调员。

简而言之,我们希望通过尽可能多的渠道来促进此信息的传播。 但是,我们希望保留 HOWTO 文档的版权,并希望收到任何重新分发 HOWTO 的计划的通知。

如果您有任何问题,请通过电子邮件联系 Linux HOWTO 协调员 Tim Bynum,地址为


14.2. 免责声明

这项工作是在我们在博洛尼亚大学 (意大利) 地球物理部门的经验之后编写的,该部门的 VAX 4000 已被基于 Linux 的 Pentium PC 取代和替换。 我的大多数同事都是 VMS 用户,其中一些人已经转到 Linux。

``从 VMS 到 Linux HOWTO'' 由 Guido Gonzato, , 和 Mike Miller, 编写,后者贡献了关于读取 VMS 磁带的部分。 非常感谢我的同事和朋友,他们帮助我定义了普通 VMS 用户的需求和习惯,尤其是 Warner Marzocchi 博士。

请帮助我改进此 HOWTO。 我不是 VMS 专家,也永远不会是,因此非常欢迎您的建议和错误报告。

享受吧,

Guido=8-)