更聪明的工作

    技术2024-06-23  66

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

    但是,最引人注目的(至少对我来说-外行人士和等待发生的事故)是他工作的相对轻松。 在从事该行业大约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 。 (请参见侧边栏“验证工作 ”以了解如何预览命令行。)

    如果要查看命令行标记的扩展内容,请使用echo命令:

    $ echo ~joe/doc/report.txt ~/info /guests/joe/doc/report.txt /staff/bobr/info $ echo $SHELL /bin/zsh $ ls architecture.txt Services.pdf services.txt Schema.pdf $ echo *.txt architecture.txt services.txt

    echo命令将发出您在命令行上键入的任何内容。 但是,由于外壳程序在调用任何程序之前先扩展(大多数)命令行参数,所以该命令将打印所有替换的结果。 (shell环境变量$SHELL包含当前正在运行的shell的名称。)

    另一个有价值的标志是.. (两个句点),它是当前目录正上方的目录的缩写。 与..和. ,即当前工作目录的名称,您可以引用文件系统中相对于当前工作目录的文件和目录。

    例如,如果您当前的工作目录是〜/ 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的使用。

    Z壳球

    Z shell具有多个独特且出色的glob运算符。 这里有一些脱颖而出。

    **/ glob运算符将扩展到下面的所有目录,并包括当前的工作目录。 将**/视为内置的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 Glob运算符可匹配文件类型。 提供与以前一样的模式,但附加(.) , (/) , (*)或(@)以分别匹配常规文件,目录,可执行文件和符号链接:

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

    Z Shell还为(/)表达式提供了快捷方式。 只需以正斜杠结束模式即可将结果限制为目录:

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

    清单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

    Processed: 0.015, SQL: 9