每个熟练的贸易都有其秘密-那些即使是最复杂的任务也无法理解的小技巧,技术和工具。 例如,我的邻居是木匠大师。 他的裸眼可以非常精确地测量和转移角度,斜接缝无缝连接,他的整理工作赢得了当地报纸的好评。
但是,最引人注目的(至少对我来说-外行人士和等待发生的事故)是他工作的相对轻松。 在从事该行业大约20年之后,他没有掌握任何捷径。 快捷键在这里节省了时间,在这里节省了一些劳力,但是重复执行一些任务,例如剪裁,钉子钉子和组装框架,节省下来的钱真是累了。
程序员,系统管理员和其他UNIX®计算机专业人员都有他们自己的专用工具:
- 中央处理器
- 内存
- 操作系统
- 应用领域
- 贝壳
就像经验丰富的木匠一样,知道一些技巧并使用一些工具可以节省大量的时间和精力。 口语UNIX的第一期介绍了UNIX命令行的功能。 本文向您展示了一些方便的Shell快捷方式,这些快捷方式肯定会扩大您对Shell提示的掌握。
休息一下手指,别摔断手指
如第1部分所示,UNIX命令行的功能是无与伦比的。 仅需几次按键和一点句法的胶水 ,包括管道(|), tee
和重定向,就可以在每个Shell提示符处组装自己的即兴数据转换。
例如,此命令在主目录中查找包含单词Monthly Report的所有文本文档:
$ find /home/joe -type f -name '*.txt' -print | xargs grep -l "Monthly Report"
该命令搜索整个主目录( find /home/joe
)以查找带有后缀.txt
所有常规文件( -type f
),然后运行grep
命令搜索字符串Monthly Report.
如果找到匹配项,则-l
选项打印文件名。 因此,命令的输出是匹配文件的列表。
尽管上面的命令很有用,但记住并重新键入命令很麻烦,特别是如果您定期使用该命令。 此外,当命令行是电子邮件,文件,工具(例如编辑器,编译器,监视器)和远程系统的主要界面时,您可以在命令行上节省的任何时间和精力都可以更好地用于此任务。在眼前。 毕竟,一秒钟的千分之几真的加起来了。
为了解决重复性任务,UNIX Shell提供了各种有用的快捷方式,包括:
- 印记
- 通配符
- 命令历史
- 环境变量
- 别名
- 启动文件
例如,你可以参考你的home目录与印记~
(波浪号)。 您还可以使用$HOME
环境变量引用您的主目录,如清单1所示。
清单1. UNIX shell快捷方式
$ whoami
strike
$ echo ~
/Users/strike
$ echo $HOME
/Users/strike
$ !!
echo $HOME
/Users/strike
最后一条命令!!
(两个感叹号),可能看起来有些奇怪,但这是一个命令历史标记,可以逐字重复先前的命令。 (许多外壳程序还允许您使用向上箭头键或按Control + P浏览以前的命令列表。)
让我们更详细地了解每种shell快捷方式。 这篇文章是基于的Z shell( zsh
-见相关信息 ),这通常是安装在/斌/ zsh中。 (如果您的系统没有Z Shell,请让系统管理员安装它。)Z Shell具有一些特殊功能;例如, 否则,此处显示的所有示例都可以在所有现代UNIX shell中使用。
壳牌
许多命令行参数的使用频率很高,壳提供印记,或符号,作为简写。 您只需输入符号即可。
如上所述, ~
表示您的主目录。 类似的缩写~ username
,指的是用户名的主目录。 例如, ~joe
引用joe的主目录。 因此,要将文件从joe的doc目录复制到您的info目录,可以键入:
$ cp ~joe/doc/report.txt ~/info
假设joe的主目录是/嘉宾和主目录是/人员/水浸液, ~joe
被替换/嘉宾/乔 ~
变为/人员/水浸液,最后就可以得到命令cp /guests/joe/doc/report.txt /staff/bobr/info
。 (请参见侧边栏“验证工作 ”以了解如何预览命令行。)
另一个有价值的标志是..
(两个句点),它是当前目录正上方的目录的缩写。 与..
和.
,即当前工作目录的名称,您可以引用文件系统中相对于当前工作目录的文件和目录。
例如,如果您当前的工作目录是〜/ jane / projects / lambda,则简写../..
指的是上述目录中的两个目录 ,即〜/ jane。 要引用包含〜/ jane的目录,可以使用../../../
(“以上三个目录”)或路径~jane/../
。 后一个路径表示从〜jane开始,然后进入一个目录 。
要将文件复制到当前目录,无需命名。 简称为。 (“点”):
$ cp -pr /path/to/lots/of/stuff .
前一个命令以递归方式将/ path / to / lots / of / stuff目录复制到当前目录,并保留原始的时间和日期戳。 引用..
和.
路径名 被称为相对路径名。 以/(正斜杠)或〜(波浪号) 开头的路径名被称为绝对路径名,因为您是从文件系统的顶部或目录层次结构的顶部引用文件的。
通配符和模式
使用sigils,您可以减少键入时间,并且可以快速,简洁地引用特定目录。 通配符是引用目录内容的另一种速记形式。
例如,假设您有一个包含100个文件的目录。 一些是C后缀.c结尾的源代码文件,其他是后缀.o后缀的目标文件,还有一些是文本文档( .txt ),脚本( .sh )和可执行文件(具有执行权限的文件)。 要仅列出C
文件,只需键入:
$ ls *.c
通配符*
(通常称为星 号,而不是星号 )表示匹配任何字符序列 。 .c
文件扩展名是一种文字模式,仅匹配一个句点,后跟一个小写的c。 因此, *.c
表示任何字符序列,后跟一个句点和一个小写字母c 。 给定*.c
,shell将在当前目录中查找(除非您提供前导的绝对或相对路径名),查找与模式匹配的每个文件名,将*.c
扩展到该名称列表,并将该列表作为参数传递到ls
命令。
清单2演示了基于*.c
的源代码对命令行下载实用程序wget
的使用。
清单2.使用通配符在目录中查找C源代码文件
$ ls *.c
alloca.c
ansi2knr.c
cmpt.c
connect.c
convert.c
...
将通配符扩展到匹配文件名列表的过程称为globbing, UNIX shell具有各种globlob运算符(所谓的globs )来帮助您表达所要查找的内容:
- glob
*
(星号)匹配任何字符或字符序列,包括空序列。 - 球
?
(问号)匹配任何单个字符。 - glob
[ ]
(方括号)与任何随附的字符匹配。 在方括号内,您可以使用-
(连字符)来指代一系列字符,例如[az]
或所有小写字母。
(Z Shell具有许多唯一的Glob运算符。有关更多信息,请参见侧栏Z Shell Glob 。)
您还可以根据需要重复Glob运算符。 清单3提供了其他示例。
清单3.通配符示例
1 $ ls -1 -a -F
./libs
ChangeLog
ChangeLog-branches/
Makefile
Makefile.in
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
config.h.in
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
...
wget*
2 $ ls -a -F .*
./lib
3 $ ls -1 *.?
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
...
4 $ ls -1 ????.?
cmpt.c
cmpt.o
5 $ ls [a-c]?*.*
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
config.h.in
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
cookies.c
cookies.h
cookies.o
在清单3中 ,命令1显示目录中的所有条目,包括以开头的条目。 (点)在一长串中。 ( -a
选项显示所谓的点文件 ; -1
选项在一行中列出所有内容; -F
选项突出显示带有/的目录(正斜杠)和带有*的可执行文件(星号)。)
命令2查找名称以点开头的每个条目(因此为*)。 第三个命令仅查找后缀为一个字母的那些项目。
第四个命令仅查找具有四个字符,后跟一个点和一个字符的项目。 最后,命令5查找以小写a,小写b或小写c开头的项目,然后是至少一个字母,然后是任何东西,然后是句点,然后是后缀。 如您所见,您可以根据需要重复glob运算符。
那么, ls *.z
产生什么(假设不存在此类文件)? 它会产生一个有用的错误消息:
$ ls *.z
zsh: no matches found: *.z
一点(命令)历史
到目前为止,您已经了解了如何指定路径以及选择文件。 您可以在命令行中表达自己。 但是,即使所有命令行简短而有趣,您仍然可能会厌倦一遍又一遍地键入相同的内容。 特别是,您可能会厌倦键入带有大量选项的冗长而复杂的命令行,或者参数的顺序必须如此。 幸运的是,大多数shell都保留了先前命令的历史记录 。 要重新运行命令,只需在历史记录列表中找到它的条目并重新运行它。 与外壳程序的其他部分一样,快捷方式使引用变得快速而简单。
要在Z Shell中启用命令历史记录,请键入:
$ HISTSIZE=500
$ SAVEHIST=500
在此,命令指定外壳程序和持久性历史记录文件都应保留最后500个命令。 (默认情况下,Z Shell仅保存最后30条命令。)请查阅Shell文档,以获取有关如何捕获和保留命令历史记录的信息。
在外壳中工作了一段时间后,您可以通过简单地输入history
来查看命令历史history
:
$ history
...
781 /bin/ls -d */
782 /bin/ls -F *(/)
783 /bin/ls -d -F *(/)
784 /bin/ls -d -F */
785 /bin/ls -d */
您运行的每个命令都分配有一个顺序的数字标识符。 您使用该标识符(例如782)来引用整个命令和每个命令的一部分。 要逐字重新运行命令,请输入!
(感叹号)后跟命令编号:
$ !785
ChangeLog-branches/ doc/ po/ src/ util/ windows/
如果要从历史命令中获取特定的自变量,请使用!来引用该命令。 (感叹号)并提供:N,其中0表示命令名称, 1表示第一个参数,依此类推。 例如,要提取历史记录日志中命令782的第二个参数,请键入清单4中所示的代码。
清单4.从命令782中提取第二个参数
$ echo !782:2
echo *(/)
ChangeLog-branches doc po src util windows
$ ls AUTHORS COPYING INSTALL MACHINES
AUTHORS COPYING INSTALL MACHINES
$ echo !!:3
echo INSTALL
$ history -2
788 ls AUTHORS COPYING INSTALL MACHINES
789 echo INSTALL
$ echo !788^
echo AUTHORS
AUTHORS
$ echo !788$
echo MACHINES
MACHINES
命令history -2
打印前两个命令。 作为快捷方式,您可以使用^
(克拉)来引用命令的第一个参数(而不是命令名称本身),并且可以使用快捷方式$
(美元符号)来引用历史命令的最后一个参数。 您还可以使用范围符号来引用一系列参数,如清单5所示。
清单5.范围符号
$ echo AUTHORS COPYING INSTALL MACHINES
AUTHORS COPYING INSTALL MACHINES
$ echo !!:1-2
echo AUTHORS COPYING
AUTHORS COPYING
还有其他更直接的方式可以调用历史命令。 一种方法是搜索它:
$ ls I*
$ ls M*
$ echo !?M
ls INSTALL
构造!?M
要求提供包含大写字母M的最新历史命令行。
环境变量
讲流利的命令行是UNIX的一项基本技能。 但是,说UNIX不仅要在shell提示符下停止-您还必须与无数的UNIX实用程序进行通信。 在UNIX中,环境变量将设置保留在Shell中,并允许您将首选项传播到从命令行启动的每个实用程序。
某些环境变量(称为外壳程序变量)仅由外壳程序用来控制其行为。 例如,只有Z shell使用$HISTSIZE
和$SAVEHIST
(如上所示)来管理命令历史记录。 将shell变量视为设置。
其他环境变量将导出或全局可用,并复制到您从命令行启动的每个命令的进程空间( 环境 )中。 例如, $HOME
是一个特殊的环境变量,它保留主目录的位置。 UNIX登录序列设置$HOME
(和其他环境变量),然后启动您的外壳,外壳再使用$HOME
查找所有外壳启动文件。 您启动的其他应用程序,例如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
您可能会意识到其中许多变量; 其他人可能是新的。 外壳程序级别( $SHLVL
)显示了您有多少个外壳程序。 1表示登录外壳; 2表示您从登录shell启动了另一个shell,依此类推。 您可以使用$SHLVL
的值更改每个后续嵌套shell的提示。 $TERM
反映您的终端(可能是终端仿真器)设置-对于确保正确呈现文本,颜色以及正确解释击键很重要。 $PWD
是您的当前工作目录,而$OLDPWD
是您的先前工作目录。 您可以使用这两个变量来快速在两个目录之间来回移动,如清单7所示。
清单7.在目录之间切换
$ echo $PWD
/Users/strike
$ echo $OLDPWD
/Local/src/versions/wget/wget-1.9
$ cd $OLDPWD
$ echo $PWD
/Local/src/versions/wget/wget-1.9
$ echo $OLDPWD
/Users/strike
上面列表中的其余环境变量是特定于应用程序的。 每个应用程序保留首选项,这些首选项控制每个相关应用程序在启动时的工作方式。 $PERL5LIB
是Perl查找自定义库的搜索路径。 ls
命令使用$CLICOLOR
以彩色呈现文件类型(目录以蓝色呈现,可执行文件以绿色呈现,依此类推)。 自定义应用程序环境变量通常记录在程序的手册页中。
设置环境变量与设置外壳变量相同。 但是,必须导出变量以使其全局可用:
$ MYVARIABLE=$HOME/projectX
$ export TMPDIR=/tmp/projectX
前一个命令设置一个名为$MYVARIABLE
的shell变量。 (前导美元符号是shell提示符。设置变量时,不会提供$。但是,无论何时使用变量,都确实需要美元符号,如$MYVARIABLE
。) $MYVARIABLE
仅可见到外壳,因为它没有被导出。 要查看所有shell变量的列表,请输入set
。 set
的输出包括环境变量,因为环境变量也可用于外壳程序。
在后一个命令中, $TMPDIR
被设置,导出,并且可用于从外壳启动的所有应用程序。 使用$TMPDIR
一个应用程序是GNU编译器集合(GCC)编译器。 您存储在$TMPDIR
的值是GCC生成其临时文件的位置。
如果要除去环境变量,只需键入unset
和变量名,如清单8所示。
清单8.删除环境变量
$ set
HOME=/Users/strike
MYVARIABLE=/Users/strike/projectX
TMPDIR=/tmp/projectX
...
$ unset MYVARIABLE TMPDIR
$ set
HOME=/Users/strike
....
别名和启动文件
前面的部分可能使您担心在命令行中必须键入多少内容。 是的,有很多东西要学习-这是因为shell环境非常丰富。 但是请记住,强大的能力带来了巨大的生产力(对《蜘蛛侠》表示很多歉意)。
为了节省这些宝贵的击键并保留您所做的所有设置,UNIX shell分别提供了别名和启动文件。 别名是您创建的快捷方式。 每次外壳启动时都会读取启动文件 ,并且是存储(和共享)所有外壳设置(例如外壳变量(选项),环境变量和别名)的理想位置。
别名是您使用的简短序列,而不是较长的命令。 您可以将别名视为命令行的昵称。 而不是输入:
$ find /home/joe -type f -name '*.txt' -print | xargs grep -l "Monthly Report"
在命令提示符下,您可以键入创建的昵称:
$ findreports
该外壳很繁重,用其扩展替换了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
...
$ alias lt='ll -t'
$ lt -d 2002*
drwxrwxr-x 2 www-data www-data 4096 Apr 19 2002 2002-05
drwxrwxr-x 2 www-data www-data 4096 Apr 15 2002 2002-04
drwxrwxr-x 2 www-data www-data 4096 Jan 22 2002 2002-03
drwxrwxr-x 2 www-data www-data 4096 Jan 16 2002 2002-02
$ alias m='pinky | grep mstreicher'
$ m
mstreicher Martin Streicher ...
$ alias snap='pinky >> ~/.pinky'
$ snap
$ snap
$ cat ~/.pinky
Login Name TTY Idle When Where
mstreicher Martin Streicher pts/0 Jun 18 16:40 cpe-071-065-224-025.nc.res.rr.com
Login Name TTY Idle When Where
mstreicher Martin Streicher pts/0 Jun 18 16:40 cpe-071-065-224-025.nc.res.rr.com
别名ll
表示/ bin / ls-绝对路径永远不会被别名替换代替。
当您键入ll
,它将被其别名替换,并附加所有剩余的命令行参数。 因此, ll -d 2002*
实际上是命令/bin/ls -l -d 2002*
。 别名lt
表示ll
并添加-t
标志以按创建时间排序。 lt
别名扩展为/bin/ls -l -t -d 2002*
。 m
别名包括一个管道。 snap
别名使用重定向将命令的输出附加到文件。
要查看在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所示。
清单11.同时查看多个别名
$ unalias m snap
$ alias
alias findreports='find $HOME -type f -name "*.txt" -print | xargs grep -l
"Monthly Report"'
alias ll='/bin/ls -l'
alias lt='ll -t'
最后,在经过如此艰苦的设置之后,您将需要保留下一次设置。 确实,您希望外壳在各个会话之间以及各个实例之间保持一致-例如,在工作站上打开多个终端窗口时。
Shell包含启动文件,用于在Shell启动时(重新)初始化环境。 启动文件可以很简单-只是变量和值的列表-也可以很复杂,包括自定义逻辑和精心设计的功能。 有些用户保留许多启动文件集,每个项目一组。
Z Shell使用启动文件.zshrc和.zprofile,它们都位于您的主目录中。 (其他外壳程序具有相似的文件,并且名称相似,您可以阅读外壳程序文档以获取详细信息。某些外壳程序还提供了关闭文件或在外壳程序退出时运行的文件。).zshrc文件是source或读取的,并且每当您启动新的shell时都会进行处理; .zprofile文件仅在启动登录Shell时才源。
配置完外壳后,请对设置进行快照,并将其保存在外壳启动文件之一中:
$ set >> $HOME/.zshrc
$ alias >> $HOME/.zshrc
注意:您可能要编辑生成的.zshrc文件,并删除特定于会话的变量。
更大的力量
ew! 本期Speaking UNIX涵盖了很多领域,但是您的勤奋应该会产生丰厚的回报。 更聪明,更轻松地工作,并节省额外的时间来做真正重要的事情,例如玩斜线游戏。
下次, Speaking UNIX肯定会变老。 我将放弃那些流行的浏览器,并研究如何完全从命令行连接,下载,上传,传输和通信。
敬请关注。
翻译自: https://www.ibm.com/developerworks/aix/library/au-speakingunix2.html