对话 UNIX:第 2 部分: 做得多不如做得巧--笔记

1.联合命令

例如,下面的命令将在您的 home 目录中查找所有包含单词 Monthly Report 的文本文件:

$ find /home/joe -type f -name '*.txt' -print | xargs grep -l "Monthly Report"          
2.UNIX Shell 提供了各种有用的快捷方法,具体包括:
  • 符号
  • 通配符
  • 命令历史
  • 环境变量
  • 别名
  • 启动文件
3. 清单 1. UNIX Shell 中的快捷方法
                
$ whoami
strike

$ echo ~
/Users/strike

$ echo $HOME
/Users/strike

$ !!
echo $HOME
/Users/strike

最后一个命令 !!(两个感叹号),可能看起来有些奇怪,但它是一种命令历史符号,可以一字不差地重复前面的命令。(许多 Shell 还允许您使用向上箭头键或按 Control+P 来浏览以前的命令列表。)

其实,要察看历史命令上下箭头更好使吧,&_&,history 也可以


4. echo *.txt
1)$ echo $SHELL
/bin/zsh
2)$ ls
architecture.txt Services.pdf
services.txt Schema.pdf
3)$ echo *.txt
architecture.txt services.txt

echo 命令将完整地表达您在命令行中输入的内容。然而,因为 Shell 会在调用任何程序之前,对(大多数)命令行参数进行扩展,所以该命令将打印出所有替换的结果。(Shell 环境变量 $SHELL 包含当前正在运行的 Shell 的名称。)

5. Z Shell 通配符匹配操作符

Z Shell 具有一些独特的和不可多得的通配符匹配操作符。下面是其中一些典型的操作符。

**/ 通配符匹配操作符展开为所有的下级目录,包括当前工作目录。可以将 **/ 看作内置的 find 命令。再次使用 wget 源代码,您可以使用下面的命令查找所有的 Makefile:

$ echo **/Makefile
Makefile doc/Makefile po/Makefile
src/Makefile util/Makefile
windows/Makefile

如果您不打算包含当前工作目录,那么只需输入 */**/,如下面的示例所示:

$ echo */**/Makefile
doc/Makefile po/Makefile
src/Makefile util/Makefile
windows/Makefile

另一种有用的 Z Shell 通配符匹配操作符可以匹配文件类型。提供与前面相同的模式,但需要追加 (.)(/)(*)(@),以便分别匹配常规文件、目录、可执行文件和符号链接:

$ ls -d -F *(/)
ChangeLog-branches/ doc/ po/ src/ util/ windows/

Z Shell 还为 (/) 表达式提供了一种快捷方法。只需在模式的末尾添加一个正斜杠,就可以将输出结果限定为目录:

 
$ ls -d */
ChangeLog-branches/ doc/ po/ src/ util/ windows/

6. 关于(命令)历史

到 目前为止,您已经了解了如何指定路径和选择相应的文件。您可以在命令行中描述需要完成的任务。然而,即使所有的命令行都很短并且很简单,但您仍然有可能对 反反复复地输入这些相同的内容而感到厌烦。尤其是,您可能厌倦了输入冗长的、复杂的命令行,其中可能包含大量的选项、或者参数的顺序有严格的要求。幸运的 是,大多数 Shell 都维护了以前命令的历史。要再次运行一个命令,只需从这个历史列表中找到相应的条目,然后再次运行它。与 Shell 中其他的部分一样,通过快捷方法可以快速和轻松地进行引用。

要在 Z Shell 中启用命令历史,可以输入:

$ HISTSIZE=500
$ SAVEHIST=500
7. 环境变量

在 UNIX 中,环境变量保存了 Shell 中的相关设置,并允许您将首选项传播到从命令行启动的所有实用工具中。

有些环境变量称为 Shell 变量,Shell 仅使用这些变量控制其自身的行为。例如,只有 Z Shell 使用 $HISTSIZE$SAVEHIST 管理命令历史,如上所述。可以将 Shell 变量看作相应的设置。

需要对其他的环境变量进行导出、或使得它们全局可用,并将它们复制到从命令行中启动的每个命令的进程空间(即环境)。例如,$HOME 是一个特殊的环境变量,它保存了您的 home 目录的位置。UNIX 登录序列将设置 $HOME(以及其他的环境变量),然后启动 Shell,而 Shell 反过来使用 $HOME 查找所有的 Shell 启动文件。您所启动的其他应用程序,如 SSH 和 FTP,引用 $HOME 查找 .netrc 文件(用于存储机密的、远程访问的密码)。有些环境变量,如 $HOME$PATH$SHELL,会被所有应用程序使用。其他的环境变量可能专门针对某个应用程序。

要查看当前所有的环境变量,可以输入 printenv,如清单 6 所示。(根据系统管理员对系统所进行的配置,您系统中的环境变量可能会比本文中所介绍的更多或更少。)

清单 6. 查看环境变量
                
$ printenv
PATH=/Users/strike/bin:/Applications/xampp/xamppfiles/bin:/Users/strike/bin:/usr/bin:/
bin:/usr/sbin:/sbin
HOME=/Users/strike
SHELL=/bin/zsh
USER=strike
TERM=xterm-color
LOGNAME=strike
SHLVL=1
PWD=/Local/src/versions/wget/wget-1.9
OLDPWD=/Local/src/versions/wget/wget-1.9/src
PERL5LIB=/Applications/xampp/xamppfiles/lib/perl5/site_perl/5.8.7:/Projects/IGSP/src
CLICOLOR=true
MANPATH=/Local/root/share/man:/usr/share/man:/opt/local/share/man
INFOPATH=/opt/local/share/info
LESS=-n

您可能认识其中大多数的变量,而其他一些可能是新出现的。Shell 级别( $SHLVL)显示您所处的 Shell 的深度。 1 表示登录 Shell, 2 表示您从登录 Shell 中启动了另一个 Shell,依此类推。您可以使用 $SHLVL 的值来更改后续 Shell(嵌套 Shell)的提示符。 $TERM 反映了您的终端(可能是终端模拟程序)设置,对于确保正确地呈现文本、颜色以及对按键进行正确的解释,这是非常重要的信息。 $PWD 是您的当前工作目录,而 $OLDPWD 是上一次的工作目录

---------------------------------------------

设置环境变量与设置 Shell 变量的方法相同。然而,您必须导出该变量,以使得它全局可用:

$ MYVARIABLE=$HOME/projectX
$ export TMPDIR=/tmp/projectX

前一个命令设置了名为 $MYVARIABLE 的 Shell 变量。(开头的美元符号是 Shell 提示符。您在设置变量时,不用提供这个 $ 符号。然而,当您使用这个变量时,必须使用美元符号,比如 $MYVARIABLE。)$MYVARIABLE 仅对 Shell 是可见的,因为没有将其导出。要查看所有 Shell 变量的列表,可以输入 setset 的输出包括环境变量,因为它们对 Shell 来说也是可用的。

在后面的一个命令中,设置并导出了 $TMPDIR,因此它对于从 Shell 中启动的所有应用程序都是可用的。GNU Compiler Collection (GCC) 编译器是一个使用 $TMPDIR 的应用程序。$TMPDIR 中所存储的值表示 GCC 用来存放生成的临时文件的位置。


如果您要删除一个环境变量,只需输入 unset 加上变量名即可,如清单 8 所示。


清单 8. 删除环境变量
                
$ set
HOME=/Users/strike
MYVARIABLE=/Users/strike/projectX
TMPDIR=/tmp/projectX
...

$ unset MYVARIABLE TMPDIR

$ set
HOME=/Users/strike
....
8. 别名和启动文件

为了保留以前输入的内容和保存以前的所有设置,UNIX Shell 分别提供了别名和启动文件。别名 是您所创建的快捷方法。每次 Shell 启动时都会读取启动文件,这是保存(和共享)所有 Shell 设置的理想的地方,如 Shell 变量(选项)、环境变量和别名。

别名是一个简短的序列,您可以使用它来代替一个较长的命令。您可以把别名看作是一个命令行的缩写。无需输入:

$ find /home/joe -type f -name '*.txt' -print | xargs grep -l "Monthly Report"

在命令提示符处,您可以输入已经创建的别名:

$ findreports

Shell 减少了工作的复杂程度,它会将 findreports 替换成其扩展形式。要创建 findreports 别名,可以输入:

alias findreports='find $HOME -type f -name "*.txt" -print | 
xargs grep -l "Monthly Report"'

必须使用单引号确定每个别名的界限。如果您需要在别名中使用引号,那么可以使用双引号。Z Shell 别名可以包含许多 Shell 基本单位,包括变量、管道、重定向、其他别名和其他 Shell 操作数,如清单 9 所示。


清单 9. Z Shell 基本单位
                
$ alias ll='/bin/ls -l'
$ ll -d 2002*
drwxrwxr-x 2 www-data www-data 4096 Jan 16 2002 2002-02
drwxrwxr-x 2 www-data www-data 4096 Jan 22 2002 2002-03
drwxrwxr-x 2 www-data www-data 4096 Apr 15 2002 2002-04
drwxrwxr-x 2 www-data www-data 4096 Apr 19 2002 2002-05
...

要查看 Shell 中设置的所有别名,只需输入 alias(不带参数)即可,清单 10 所示。


清单 10. 查看 Shell 中所有的别名
                
$ alias
alias findreports='find $HOME -type f -name "*.txt" -print | xargs grep -l
"Monthly Report"'
alias ll='/bin/ls -l'
alias lt='ll -t'
alias m='pinky | grep mstreicher'
alias snap='pinky >> ~/.pinky'
...

如果您要删除别名,只需输入 unalias 加上别名的名称即可。


清单 11. 同时删除多个别名
                
$ unalias m snap ---删除别名

Z Shell 使用启动文件 .zshrc 和 .zprofile,这两个文件都位于您的 home 目录中。(其他的 Shell 也具有类似名称的类似文件,您可以阅读 Shell 文档以了解这些细节。有些 Shell 还提供了关闭 文件、或当 Shell 退出时运行的文件。)当启动新的 Shell 时,会将 .zshrc 文件作为信息来源,或对其进行读取和处理;而只有在启动登录 Shell 时才会将 .zprofile 文件作为信息来源。

在您完成对 Shell 的配置之后,请捕获这些设置的快照并将其保存到一个 Shell 启动文件中:

$ set >> $HOME/.zshrc
$ alias >> $HOME/.zshrc

注意:您可能需要编辑所得到的 .zshrc 文件,并删除那些会话特定的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值