Paul Brown 解释了 Linux shell 命令中那个不起眼的“点”的各种意思和用法。
在现实情况中,使用 shell 命令编写的单行命令或脚本可能会令人很困惑。你使用的很多工具的名称与它们的实际功能相差甚远(grep 、tee 和 awk ,还有吗?),而当你将两个或更多个组合起来时,所组成的 “句子” 看起来更像某种外星人的天书。
因此,上面说的这些对于你并无帮助,因为你用来编写一连串的指令所使用的符号根据你使用的场景有着不同的意义。
位置、位置、位置
就拿这个不起眼的点(. )来说吧。当它放在一个需要一个目录名称的命令的参数处时,表示“当前目录”:
find . -name "*.jpg"
意思就是“在当前目录(包括子目录)中寻找以 .jpg 结尾的文件”。
ls . 和 cd . 结果也如你想的那样,它们分别列举和“进入”到当前目录,虽然在这两种情况下这个点都是多余的。
而一个紧接着另一个的两个点呢,在同样的场景下(即当你的命令期望一个文件目录的时候)表示“当前目录的父目录”。如果你当前在 /home/your_directory 下并且运行:
cd ..
你就会进入到 /home 。所以,你可能认为这仍然适合“点代表附近目录”的叙述,并且毫不复杂,对吧?
那下面这样会怎样呢?如果你在一个文件或目录的开头加上点,它表示这个文件或目录会被隐藏:
$ touch somedir/file01.txt somedir/file02.txt somedir/.secretfile.txt $ ls -l somedir/ total 0 -rw-r--r-- 1 paul paul 0 Jan 13 19:57 file01.txt -rw-r--r-- 1 paul paul 0 Jan 13 19:57 file02.txt $ # 注意上面列举的文件中没有 .secretfile.txt $ ls -la somedir/ total 8 drwxr-xr-x 2 paul paul 4096 Jan 13 19:57 . drwx------ 48 paul paul 4096 Jan 13 19:57 .. -rw-r--r-- 1 paul paul 0 Jan 13 19:57 file01.txt -rw-r--r-- 1 paul paul 0 Jan 13 19:57 file02.txt -rw-r--r-- 1 paul paul 0 Jan 13 19:57 .secretfile.txt $ # 这个 -a 选项告诉 ls 去展示“all”文件,包括那些隐藏的
然后就是你可以将 . 当作命令。是的,你听我说:. 是个真真正正的命令。它是 source 命令的代名词,所以你可以用它在当前 shell 中执行一个文件,而不是以某种其它的方式去运行一个脚本文件(这通常指的是 Bash 会产生一个新的 shell 去运行它)
很困惑?别担心 —— 试试这个:创建一个名为 myscript 的脚本,内容包含下面一行:
myvar="Hello"
然后通过常规的方法执行它,也就是用 sh myscript (或者通过 chmod a+x myscript 命令让它可执行,然后运行 ./myscript )。现在尝试并且观察 myvar 的内容,通过 echo $myvar (理所当然你什么也得不到)。那是因为,当你的脚本赋值 "Hello" 给 myvar 时,它是在一个隔离的bash shell 实例中进行的。当脚本运行结束时,这个新产生的实例会消失并且将控制权转交给原来的shell,而原来的 shell 里甚至都不存在 myvar 变量。
然而,如果你这样运行 myscript :
. myscript
echo $myvar 就会打印 Hello 到命令行上。
当你的 .bashrc 文件发生变化后,你经常会用到 . (或 source )命令,就像当你要扩展 PATH 变量那样。在你的当前 shell 实例中,你可以使用 . 来让变化立即生效。
双重麻烦
就像看似无关紧要的一个点有多个含义一样,两个点也是如此。除了指向当前目录的父级之外,两个点(.. )也用于构建序列。
尝试下这个:
echo {1..10}
它会打印出从 1 到 10 的序列。在这种场景下,.. 表示 “从左边的值开始,计数到右边的值”。
现在试下这个:
echo {1..10..2}
你会得到 1 3 5 7 9 。..2 这部分命令告诉 Bash 输出这个序列,不过不是每个相差 1,而是相差 2。换句话说,就是你会得到从 1 到 10 之间的奇数。
它反着也仍然有效:
echo {10..1..2}
你也可以用多个 0 填充你的数字。这样:
echo {000..121..2}
(编辑:ASP站长网)
|