当前位置: 首页 > 科技观察

Linux工具:点的含义

时间:2023-03-13 13:43:26 科技观察

PaulBrown解释了Linuxshell命令中那个不起眼的“点”的各种含义和用法。在现实世界中,使用shell命令编写的单行命令或脚本可能会非常混乱。您使用的许多工具的名称与它们的实际用途相去甚远(grep、tee、awk,还有什么?),当您组合两个或多个工具时,生成的“句子”看起来更像是某种外星人的圣经。因此,上面的内容对你没有帮助,因为你用来写一系列指令的符号,根据你使用的场景不同,其含义也不同。位置,位置,位置让我们以这个不起眼的点(.)为例。当作为需要目录名的命令的参数放置时,它表示“当前目录”:find。-name"*.jpg"意思是“在当前目录(包括子目录)中查找以.jpg结尾的文件”。是的。和光盘。也如您预期的那样工作,它们分别枚举和“潜入”当前目录,尽管在这两种情况下点都是多余的。两个点,一个紧接另一个,在相同的上下文中表示“当前目录的父目录”(即当您的命令需要一个文件目录时)。如果您当前位于/home/your_directory并运行:cd..您将进入/home。所以,您可能认为这仍然符合“点代表附近目录”的叙述并且并不复杂,对吧?那么接下来会发生什么?如果在文件或目录的开头放一个点,则表示该文件或目录将被隐藏:$touchsomedir/file01.txtsomedir/file02.txtsomedir/.secretfile.txt$ls-lsomedir/total0-rw-r--r--1paulpaul0Jan1319:57file01.txt-rw-r--r--1paulpaul0Jan1319:57file02.txt$#注意没有.secretfile.txt$ls-lasomedir/total8drwxr-xr-x2paulpaul4096Jan1319:57.drwx------48paulpaul4096Jan1319:57..-rw-r--r--1paulpaul0Jan1319:57file01.txt-rw-r--r--1paulpaul0Jan1319:57file02.txt-rw-r--r--1paulpaul0Jan1319:57.secretfile.txt$#-a选项告诉ls显示“所有”文件,包括隐藏文件,然后您可以使用.作为命令。是的,听我说:。是一个真正的命令。它是source命令的同义词,因此您可以使用它在当前shell中执行文件,而不是以其他方式运行脚本文件(这通常意味着Bash将生成一个新的shell来运行它)困惑吗?别担心-试试这个:使用以下行创建一个名为myscript的脚本:myvar="Hello"并以通常的方式执行它,即shmyscript(或使其可执行,然后运行??./myscript)。现在尝试通过echo$myvar观察myvar的内容(当然你什么也得不到)。这是因为,当您的脚本将“Hello”分配给myvar时,它是在一个独立的bashshell实例中执行的。当脚本完成运行时,这个新生成的实例消失并将控制转移到原始shell,其中myvar变量甚至不存在。但是,如果您像这样运行myscript:.myscriptecho$myvar将向命令行打印Hello。您经常使用.(或源)命令,当你的.bashrc文件发生变化时,比如当你想扩展PATH变量时。在您当前的shell实例中,您可以使用.使更改立即生效。双重麻烦正如一个看似微不足道的点有不止一种含义,两个点也是如此。除了指向当前目录的父目录外,两个点(..)还用于构建序列。试试这个:echo{1..10}它将打印从1到10的序列。在这种情况下,..表示“从左边的值开始,数到右边的值”。现在试试这个:echo{1..10..2}你会得到13579。命令的..2部分告诉Bash输出序列,但不是每个相差1,而是相差2.换句话说,你会得到从1到10的奇数。它也可以反向工作:echo{10..1..2}你也可以用多个0填充你的数字。这样:echo{000..121..2}会打印出0到121之间的偶数(前导0填充):000002004006...050052054...116118120但是这是什么序列发生器的使用?当然,这是假设您的新年决心之一是更加小心您的账户支出。作为解决方案的一部分,您需要创建一个目录来对过去10年的数字发票进行分类:mkdir{2009..2019}_Invoices工作完成。或者你可能有数百个编号的文件,比如从视频剪辑中提取的帧,也许出于某种原因你只想删除从第43帧到第61帧的每三个帧:rmframe_{043..61..3}最有可能,如果你有超过100帧,它们将被命名为填充0,像这样:frame_000frame_001frame_002...这就是为什么你在命令中使用043,而不是43的原因。花括号的花招老实说,序列的魔力不是双点,而是花括号({})的魔法。看看它是如何处理字母的。这样做:touchfile_{a..z}.txt它会创建从file_a.txt到file_z.txt的文件。但是,您必须小心。使用像{Z..a}这样的序列将在大写字母和小写字母之间产生一堆非字母数字字符(既不是数字也不是字母的字形)。其中一些字形是不可打印的或具有自己的特殊含义。使用它们生成文件名可能会导致一系列意想不到且可能令人不快的影响。***值得指出的一点:包含在{...}中的序列,它们还可以包含字符串列表:touch{blahg,splurg,mmmf}_file.txt将创建blahg_file.txt、splurg_file.txt和mmmf_file.txt.当然,大括号在其他上下文中有不同的含义(惊喜!)。但那是另一篇文章。总结Bash和在其中运行的各种工具已经被试图解决特定问题的系统管理员摆弄了几十年。说系统管理员以他们自己的方式是一个特殊的物种是轻描淡写的。总而言之,与其他语言相反,Bash的设计目的不是用户友好、简单,甚至是合乎逻辑的。但这并不意味着它不强大——恰恰相反。Bash的语法和shell工具可能不一致且庞大,但它们也提供了一系列令人眼花缭乱的方法来完成几乎所有您能想到的事情。这就像拥有一个工具箱,从钻头到勺子,以及橡皮鸭、一卷胶带和一些指甲钳,您都可以在其中找到所有东西。除了引人入胜之外,探索您可以直接在shell中实现的所有功能也很有趣,所以下次我们将深入探讨如何构建更大更好的Bash命令行。在那之前,玩得开心!