;
如果需要连续运行多个命令,但是其中一些命令运行的时间比较长,而你不想长时间地守候在计算机旁,这个时候应该怎么办呢?例如,如果一个zip压缩文件中有很多John Coltrane的MP3文件,你想先解压缩,再把它们放到一个新子目录中,最后再删除原来的压缩文件,该怎么做呢?通常你只能一次运行一个命令,如下所示:
说明 为了节省篇幅,此处删除了完整列表中的所有者和组信息。
$ ls -l /home/scott/music
-rw-r--r-- 1437931 2005-11-07 17:19 JohnColtrane.zip
$ unzip /home/scott/music/JohnColtrane.zip
$ mkdir -p /home/scott/music/coltrane
$ mv /home/scott/music/JohnColtrane*.mp3
?/home/scott/music/coltrane/
$ rm /home/scott/music/JohnColtrane.zip
JohnColtrane.zip的文件大小为1.4 GB,即使是速度很快的计算机,解压这么个庞然大物也要花不少时间,而且除了坐在那里干等,你或许有更重要的事情去做。命令栈(command stacking)可以解决这一问题。
命令栈是将所有需要运行的命令放到shell的一行上,再用分号(;)隔开每个具体的命令。接着依次顺序执行每个命令,只有一个命令结束运行(无论成功或失败),才会运行下一个命令。这样的用法很容易,也确实能够节省你的时间。
用命令栈的方式,前面的一系列命令可以写成:
$ ls -l /home/scott/music
-rw-r--r-- 1437931 2005-11-07 17:19 JohnColtrane.zip
$ unzip /home/scott/music/JohnColtrane.zip ;
?mkdir -p /home/scott/music/coltrane ;
?mv /home/scott/music/JohnColtrane*.mp3
?/home/scott/music/coltrane/ ;
?rm /home/scott/music/JohnColtrane.zip
当然,在命令运行的时候,也可以使用这个办法来引入短暂的延迟。如果你想截取显示器中所有可见内容的截图,只需要运行以下命令(假设你的计算机中已经安装了ImageMagick包,几乎所有的Linux分发版中都有这个包):
$ sleep 3 ; import -frame window.tif
这个例子中的sleep命令会等待3秒钟,然后使用import命令截取屏幕截图。有几秒钟的延迟,你就有时间最小化终端控制台应用程序,把你想让截图中出现的任何窗口调到前面来。分号(;)便于从逻辑上分隔各个命令,这样你就能最大程度地使用这些命令。
警告 使用命令栈要十分谨慎,特别是删除或者移动文件的时候。确保你输入的确实是你想要运行的命令,因为这些命令是依次顺序运行的,否则可能会得到意想不到的结果。