Sucha's Homepage ~ Slack Tips

alias fun='Slackware Linux'

Issue #1, April 2005
SlackTips
(pdf versions: A4, Letter)

作者: Mikhail Zotov
中译本: Lalawu

这个部分旨在帮助 Slackware Linux 的新用户,使他们在 Linux 里的生活更有效率些。在这个特辑里,我们将会看到别名和函数如何使我们在 bash 里的日常操作更快捷。

首先,先看看来自 man bash 的引用:

当 bash 被调用为一个交互的登录 shell,或者使用 --login 选项作为一个非
交互的 shell 时,它首先从 /etc/profile 读取可执行的命令,如果文件存在
的话。读取之后,再按顺序寻找 ~/.bash_profile,~/.bash_login,和
~/.profile,顺序读取并执行这些文件如果它存在并且可读...当一个交互的
shell 不作为登录的 shell 启动时,bash 从 ~/.bashrc 读取并执行命令,如
果那个文件存在的话。

在一个刚刚装好的 Slackware 系统里,用户们在他们的主目录下并没有这些文件,所以我们首先得创建他们:

   $ touch ~/.bash_profile ~/.bashrc

我们希望我们的别名能够在一个交互的 shell 每次启动时读取(比如,当我们启动 xterm),并且像我们所希望的那样使用 ~/.bashrc。为了保证我们每次启动一个交互的 shell 时能够读取 ~/.bashrc,请把下面这几行放到 ~/.bash_profile 里:

  
   # .bash_profile
   if [ -f ~/.bashrc ]; then
     . ~/.bashrc
   fi

从此后,我就假设所有的别名和函数都写进 ~/.bashrc 里。

我们必须牢记在心的一件事是每次我们往 ~/.bashrc 加东西时,得让 shell 知道这些变化。所以我们必须 source 这些文件(man bash 或者 help source 看看帮助信息)。为了做到这一点,我们或者

  
   $ source ~/.bashrc

或者

  
   $ . ~/.bashrc

我们得避免自己手动做这些。

假设你最喜爱的编辑器是 mcedit。让我们用它打开 ~/.bashrc 并把这些置于alias 后1

  
   alias edb='mcedit ~/.bashrc && . ~/.bashrc'

现在,退出 mcedit 然后 source ~/.bashrc。从此后,当我们决定往 ~/.bashrc 里加 alias 并且让 shell 知道所需要做的一件事就是运行
   $ edb

这里我使用 edb 作为编辑 ~/.Bashrc2 的缩写。

现在我们准备去做一些有用的事。让我们以一个日常的工作开始,就是,让我们挂载或者卸载一个软盘。众所周知,用如下的命令就可以做到:

  
   $ mount /mnt/floppy
   $ umount /mnt/floppy

这些命令对于每天的使用来说显得太长了。虽然可以使用 <Ctrl> + <r> 和方向键以及命令行历史去呼出曾经使用过的命令,但我相信在这些情况下使用简短的别名更方便些。让我们再次运行 edb 并把下面这几行加到 ~/.bashrc 里面:

   # 挂载软盘
   alias mf='mount /mnt/floppy && cd /mnt/floppy && ls'
   # 卸载软盘
   alias uf='cd && umount /mnt/floppy'

退出编辑器,插入软盘,然后试一下我们刚才打上的新别名。注意我们不仅仅挂载了软盘同时也移动到了它的目录并且显示其内容。这是很方便的。

由于使用 CD 的原因,要求我们创造更多的别名使得我们可以在命令行打开和关闭光驱。让我们把下面的这些别名放到 ~/.bashrc 里(再来一次, $ edb):

  
   CDROM="/mnt/cdrom"
   alias mcd='mount $CDROM && cd $CDROM && ls'
   alias ucd='cd && umount $CDROM && eject && sleep 10 && eject -t'
   # 弹出光盘:
   alias ecd='eject'
   # 弹入光盘:
   alias ccd='eject -t'

注意,我们现在不仅仅卸载了 CD 同时还弹出了光盘,并且还有 10 秒的时间来把它拿出来,接着再自动关闭光驱。除此以外,我们还定义了一个变量,CDROM,如果我们以后还要定义其他的挂载点之类的话它将很有用。

这里我假设我们仅仅拥有一个光驱。在安装期间,Slackware 会在 /dev 目录创建对应的连接。如果你有两个光驱那么你不得不修改上面的别名。特别的,你必须明确地地指出弹出的是第二个光驱。

现在,假设我们拥有一个光盘刻录机,让我们来做一些有趣的实验。对,让我们刻录一张光盘。每个人当然都知道如何从 Slackware 的镜像站点上下载光盘镜像‘马上’刻录它。这些事情不经常发生所以人们很可能忘记这些事情是如何完成的。让我们定义一个别名来完成这个操作,比如,像这样:

  
   DEV="dev=0,0,0"
   alias burn='ccd && cdrecord -eject $DEV -dao'

这里,"0,0,0" 摘自刻录机扫描线的输出。(有人会补充,16 速或者无论什么可以确定的是设备会按希望的速度刻录 CDs。) 我们也定义了另外一个变量,DEV,在下面将会用到。

现在,刻录一张 Slackware CD,只需要弹出光盘(ecd),放进一张空白光盘,然后运行下面的命令:

  
   $ burn /pa../the/image/slackware-10.1-install-d1.iso

看啊(法)!我们甚至不用动手去弹入光盘。

现在看看我们如何从命令行很容易地刻录多任务的 CDs。我们会使用 bash 函数来实现这个壮举。

首先,让我们以一张新的 CD 开始。我假设我们使用一张 CD-RW,那么为保证它干净首先得擦除。接着,我们会把在目录中准备好的文件制作成 iso 镜像,并保存在主目录中,镜像的名字会被传递作为一个参数。最后,我们刻录这张CD,弹出光盘,删除镜像。

   # iso 镜像:
   ISO="/tmp/a.iso"

   # 制作 iso 镜像:
   alias mkiso='mkisofs -R -J -v -hide-rr-moved -o $ISO'

   # CD 刻录机在刻录 CD 前的等待时间
   WAIT="gracetime=5"

   # 另一个便于使用的别名:
   alias BURN="cdrecord -v -eject $DEV $WAIT -tao -multi $ISO && \
     rm -f $ISO && sleep 10 ; ccd"

   begincd() {
     ccd && \
     cdrecord -v blank=fast $DEV $WAIT && \
     mkiso $1 && BURN
   }
   
   addtocd() {
     ccd && \
     mkiso -C `cdrecord -msinfo $DEV` -M /dev/cdrom $1 && \
     BURN
   }

这里作一些说明。首先,我们定义了一个文件作为镜像。接着,我们定义了一个别名,不仅仅在后面的两个函数中省了我们好些按键,同时还可以在我们需要时创建一个 iso 镜像,比如,假设我们想刻录一张自己的完整 CD。除此外,我们介绍了一个变量 WAIT,同样也会节省我们一些时间。(我们一直在赶时间,不是吗?)最后,我们定义了另一个变量,BURN。它只在我们那两个函数里使用,所以我选择把它的名字全部大写。

这样,用 dir1 目录里的文件刻一张 CD,现在只要弹出光盘(ecd),放入一张CD-RW,然后运行下面的命令:

  
   $ begincd dir1

同样的,从 dir2 目录里往 CD 增加文件,只需要弹出光盘,放入 CD,然后运行命令:
   $ addtocd dir2

又快又简单,不是吗?事实上,我们甚至可以把 ecd 放在我们定义的开头然后使它等待一些时间,:-)

就像我们所看到的,别名和函数 是强大的工具。他们可以去作许许多多不同的事:

还有其他许许多多使得使用 Slackware 比这些更为有趣的事。就靠你的想象了!

备注

[1] 更为普遍的做法像下面这样:

   alias edb='$VISUAL ~/.bashrc && . ~/.bashrc'

我建议你先检查一下 $VISUAL 是否真正指向需要的编辑器 ($ declare ¦ grep VISUAL) 以防无意中跟 elvis 较劲。;-)

[2] 可以随便选择其他的名字。但在创建前得检查一下它是否已经被系统的shell 或者你 PATH 变量里的程序占用。为此,你可以运行:

  
$ help new_name
$ which new_name

当你得不到 help 找不到任何信息时就说明 new_name 并没有被占用。

[3] 特别的,这些记录可以被用来检查这个或那个包在被移除或升级之后是否留下了一些没有被删除的文件。