更聪明的工作_更聪明地工作,而不是更努力

本文深入探讨了UNIX Shell的高效使用技巧,包括路径简写、通配符、命令历史、环境变量、别名及启动文件的运用,旨在帮助用户提高工作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个熟练的贸易都有其秘密-那些即使是最复杂的任务也无法理解的小技巧,技术和工具。 例如,我的邻居是木匠大师。 他的裸眼可以非常精确地测量和转移角度,斜接缝无缝连接,他的整理工作赢得了当地报纸的好评。

但是,最引人注目的(至少对我来说-外行人士和等待发生的事故)是他工作的相对轻松。 在从事该行业大约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变量的列表,请输入setset的输出包括环境变量,因为环境变量也可用于外壳程序。

在后一个命令中, $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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值