您听说过 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 用户指南”---对于新手用户来说,它是非常宝贵的。
现在,开始吧。
本表尝试比较 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 |
当然,这不仅仅是命令名称不同的问题。请继续阅读。
这是您第一次登录之前绝对需要知道的。放松,不多。
在 VMS 下,文件名采用以下形式filename.extension;version。在 Linux 下,版本号不存在(很大的限制,但请参阅第 10.2 节);文件名通常限制为 255 个字符,并且可以有任意数量的点。文件名示例This.is_a_FILEname.txt.
Linux 区分大小写字符FILENAME.txt和filename.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 节。
在同一节点和设备中,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 |
现在来看一些其他示例
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 |
$ myprog < datafile | filter_1 | filter_2 >> result.dat 2> errors.log & |
在命令行末尾)。有关此内容的更多信息,请参见第 11 节。
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 节。
Linux 没有EDT,但有很多可用的编辑器。唯一能保证包含在每个 UNIX 版本中的是vi---忘了它吧,您的系统管理员肯定安装了一些更好的东西。可能最流行的编辑器是emacs,它可以一定程度上模拟EDT;jed是另一个提供EDT模拟的编辑器。
这两个编辑器对于编辑程序源代码特别有用,因为它们具有EDT未知的两个特性:语法高亮和自动缩进。此外,您可以从编辑器中编译您的程序 (命令ESC-X compile);如果出现语法错误,光标将定位在出错的行上。我敢打赌您再也不想使用真正的EDT了。
如果您有emacs:启动它,然后输入ESC-X edt-emulation-on。按下 ALT--X 或 ESC-X 是emacs发出命令的方式,就像EDT的 CTRL--Z 一样。从现在开始,emacs的行为就像EDT,除了几个命令。区别在于
不要按 CTRL--Z 来发出命令 (如果您这样做,您就停止了emacs。输入fg来恢复它);
有广泛的在线帮助。按 CTRL-H ?,或 CTRL-H T 来启动一个教程;
要保存文件,按 CTRL-X CTRL-S;
要退出,按 CTRL-X CTRL-C;
要在一个缓冲区中插入一个新文件,按 CTRL-X CTRL-F,然后按 CTRL-X B 在缓冲区之间切换。
如果您有jed:让您的系统管理员正确配置jed。当您启动它时,模拟已经启动;使用普通的数字键盘键,然后按 CTRL--H CTRL--H 或 CTRL-? 来获取帮助。命令的发出方式与emacs相同。此外,还有一些在原始EDT中缺失的方便的键绑定;键绑定也可以根据您自己的喜好进行定制。询问您的系统管理员。
或者,您可以使用另一个具有完全不同界面的编辑器。emacs在原生模式下是一个明显的选择;另一个流行的编辑器是joe,它可以模拟其他编辑器,例如emacs自身 (甚至更容易使用) 或 DOS 编辑器。调用编辑器如下jmacs.EXEjstar并分别按下 CTRL-X H 或 CTRL-J 来获取在线帮助。emacs和jed比旧的EDT.
TeX 和 LaTeX 与它们的 VMS 对应物相同---只是更快 :-),但是处理.dvi和.ps文件的工具更强大
要通过 TeX 运行 TeX 文件,像往常一样执行tex file.tex;
要将.dvi文件转换成.ps文件,输入dvips -o filename.ps filename.dvi;
要可视化.dvi文件,在 X 会话中输入xdvi filename.dvi &。点击页面放大。这个程序很聪明:如果您编辑并运行 TeX 生成新版本的.dvi文件,xdvi将自动更新它;
要可视化.ps文件,在 X 会话中输入ghostview filename.ps &。点击页面放大。可以打印整个文档或选定的页面。一个更新更好的程序是gv.
要打印.ps:通常命令lpr mypaper.ps可以做到,但是如果 PostScript 打印机被称为,例如,`ps' (询问您的系统管理员) 您将执行lpr -Pps mypaper.ps。有关打印队列的更多信息,请转到 第 8.4 节。
在 Linux 下编程要好得多:有很多工具可以使编程更容易和更快。例如,通过使用诸如emacs.EXEjed之类的编辑器,可以缩短编辑-保存-退出-编译-重新编辑的繁琐过程,如上所示。
这里没有实质性的差异,但请注意,在撰写本文时,可用的(免费)编译器与 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,如下所述。
实用程序make是一个用于处理分成多个源文件的程序的编译的工具。 VMS 对应物是MMS和MMK,它们具有不同的语法。
假设您有包含您的例程的源文件,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。
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." |
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,用于进行图形。
在众多可用的图形软件包中,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/
邮件:使用elm.EXEpine来处理您的电子邮件;这两个程序都有在线帮助。对于简短的消息,您可以使用mail,例如mail -s "hello mate" user@somewhere < msg.txt。您可能会喜欢像xmail之类的程序。
新闻组:使用tin.EXEslrn,这两个程序都非常直观且不言自明。
ftp:除了通常的基于字符的ftp,请您的系统管理员安装全屏的ncftp或图形化的 ftp 客户端,如xftp.
WWW:无处不在的netscape,或xmosaic, chimera,以及arena是图形化的 Web 浏览器;基于字符的浏览器是lynx,快速有效。
在这里,游戏变得艰难。学习这些特性,那么您就可以说您“了解一些关于 Linux 的知识”了 ;-)
就像在 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/ |
更多关于运行程序的信息。Linux 下没有像您习惯的那样的“批处理队列”;多任务处理的处理方式非常不同。同样,这是典型的命令行外观
$ command -s1 -s2 ... -sn par1 par2 ... parn < input > output & |
其中-s1, ..., -sn是程序开关,par1, ..., parn是程序参数。
现在让我们看看多任务处理是如何工作的。在前台或后台运行的程序称为“进程”。
要在后台启动一个进程
$ progname [-switches] [parameters] [< input] [> output] & [1] 234 |
要查看有多少个进程
$ ps -ax |
要杀死一个进程
$ kill <PID> |
$ kill -15 <PID> $ kill -9 <PID> |
除此之外,shell 允许您停止或临时挂起一个进程,将进程发送到后台,以及将进程从后台带到前台。在这种情况下,进程被称为“作业”。
要查看有多少个作业
$ jobs |
要停止在前台运行的进程
$ CTRL-C |
要暂停在前台运行的进程
$ CTRL-Z |
要将暂停的进程发送到后台(它变成一个作业)
$ bg <job> |
要将作业带到前台
$ fg <job> |
要杀死一个作业
$ kill <%job> |
更多关于文件的信息。
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 -i和mv -i在文件将被覆盖时收到警告。
您的打印作业像在 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> |
您的系统管理员已经为您提供了一些配置文件,例如.xinitrc, .profile, .inputrc等等。您可能想要编辑的是
.profile.EXE。如果要更改提示符或使某些程序自动启动,则必须编辑一个“隐藏”文件,称为:在登录时由 shell 读取。它类似于(请参见第 9 节中的示例)。这相当于;
.bash_logout:在注销时由 shell 读取。它类似于LOGOUT.COM;
.bashrc:由非登录 shell 读取。
.inputrc:此文件自定义了 shell 的键绑定和行为。
举例来说,我将包含我的.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 " |
您每天都会使用这个文件浏览器,所以我将给您一些技巧,以便最好地使用它。首先,请您的系统管理员配置less以便它不仅可以显示纯文本文件,还可以显示压缩文件、存档等等。
像最近的版本一样TYPE, less允许您双向浏览文件。它还接受一些通过按键发出的命令。最有用的是
首先,按q退出浏览器;
h为您提供广泛的帮助;
g转到文件开头,G到文件末尾,数字+g转到第“数字”行(例如125g),数字+%移动到文件的该百分比;
/pattern向前搜索“pattern”;n向前搜索下一个匹配项;?pattern和N向后搜索;
m+字母标记当前位置(例如ma); '+字母转到标记的位置。
:e检查一个新文件;
!command执行 shell 命令。
唉,Linux 仍然不支持文件版本号,但您可以通过两种方式克服此限制。第一种是使用 RCS,即修订控制系统,它允许您保留文件的先前版本。RCS 在 ``The RCS MINI-HOWTO'' 中介绍()。
第二种方法是使用知道如何处理编号备份的编辑器;emacs和jed是可以的。在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) |
在 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, zip和unzip实用程序也可用。带有扩展名.tar.gz.EXE.tgz(用tar存档,然后用gzip压缩)在 UNIX 世界中非常常见。以下是如何列出.tar.gz存档
$ tar -ztf <file.tar.gz> | less |
要从.tar.gz存档
$ tar -zxf <file.tar.gz> |
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 |
解释grep像search一样工作,并且将它与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 |
我希望这些例子能引起您的兴趣...
命令补全: 在发出命令时按下 <TAB> 将为您补全命令行。 示例:您必须输入less this_is_a_long_name; 输入less thi<TAB>就足够了。 (如果您有其他以相同字符开头的文件,请提供足够的字符来消除任何歧义。)
向上滚动: 按下 SHIFT--PAG UP(灰色键)允许您向上滚动几页,具体取决于您 PC 的视频内存。
重置屏幕: 如果你碰巧more.EXEcat一个二进制文件,您的屏幕最终可能会充满垃圾。 要解决这个问题,盲打reset或者这个字符序列echo CTRL-V ESC c RETURN.
粘贴文本: 在控制台中,请参见下文; 在 X 中,单击并拖动以选择并等待几秒钟;很可能会看到一个打开的窗口中的文本,然后单击中间按钮(如果您有两个按钮的鼠标,则同时单击两个按钮)进行粘贴。
使用鼠标: 让你的系统管理员安装gpm,一个用于控制台的鼠标驱动程序。 单击并拖动以选择文本,然后右键单击以粘贴所选文本。 它适用于不同的 VC。
(本节由 Mike Miller 编写)
有时您可能想读取在 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 轨磁带吗?),请告诉我,我会在此处添加注释。
在读取使用 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)。
标头和尾部文件包含 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 人员 :-)。
除非另有说明,Linux HOWTO 文档由其各自的作者拥有版权。 只要在所有副本上保留此版权声明,Linux HOWTO 文档可以整体或部分地以任何物理或电子媒介复制和分发。 允许并鼓励商业再分发; 但是,作者希望收到有关任何此类分发的通知。
包含任何 Linux HOWTO 文档的所有翻译、衍生作品或聚合作品都必须在此版权声明下涵盖。 也就是说,您不得从 HOWTO 中生成衍生作品并对其分发施加其他限制。 在某些情况下可以授予对这些规则的例外; 请通过以下地址联系 Linux HOWTO 协调员。
简而言之,我们希望通过尽可能多的渠道来促进此信息的传播。 但是,我们希望保留 HOWTO 文档的版权,并希望收到任何重新分发 HOWTO 的计划的通知。
这项工作是在我们在博洛尼亚大学 (意大利) 地球物理部门的经验之后编写的,该部门的 VAX 4000 已被基于 Linux 的 Pentium PC 取代和替换。 我的大多数同事都是 VMS 用户,其中一些人已经转到 Linux。
``从 VMS 到 Linux HOWTO'' 由 Guido Gonzato, , 和 Mike Miller, 编写,后者贡献了关于读取 VMS 磁带的部分。 非常感谢我的同事和朋友,他们帮助我定义了普通 VMS 用户的需求和习惯,尤其是 Warner Marzocchi 博士。
请帮助我改进此 HOWTO。 我不是 VMS 专家,也永远不会是,因此非常欢迎您的建议和错误报告。
享受吧,
Guido=8-)