外壳是否具有功能?


12

我读了很多的问题和答案像这个这个

我知道通配符在运行命令之前会被外壳扩展,它们是外壳的功能。通配符也可以与那些可以接受许多参数的命令一起使用。在find . -name *.rb 我们若在当前目录多个文件find会给我们一个错误,因为发现不能接受多个参数,解决这个是方法:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

我们通过星号转义并防止shell扩展,但是通配符是shell的功能;当我们对星号外壳进行转义时,它不知道其含义,它应该找到一个名为的文件*.rb,那么在这种情况下如何扩展星号?

Answers:


21

是的,shell *将目录*.rb中的所有字符理解为所有文件,将其理解为所有具有任何字符和结尾的文件.rb,并对其进行扩展。

find命令本身接受globbing。

如果不加引号,*那么外壳程序将在命令看到其参数之前find对其进行扩展,因此,与*.rb传递给findglob的目录匹配的所有文件的名称将传递给,而不是传递给glob 的文件findfind并将尝试解释它们作为参数,可能会导致错误,或者至少不会导致您想要的错误(仅当当前目录中没有匹配的文件时,它才能正常工作)


谢谢,这意味着我们说要封装它不是一个glob,但是某些命令可以扩展通配符?还是可以说,如果我们有一个不了解全局的外壳程序,那些知道全局的命令可以扩展它们?
Sinoosh

5
如果将*引号括起来,则外壳程序将不会对其进行扩展,并且将包括glob在内的参数传递给可以理解glob的命令-对于接受正则表达式的任何命令都应相同,应始终将其引号...
Zanna

1
我的荣幸^ _ ^
Zanna 2016年

7
@Sinoosh:请注意,并非所有命令都了解glob语法。恰好是find
slebetman的

1
@Sinoosh Find并不是真正地“扩展”通配符,而是将其用作测试以匹配它遇到的每个文件名的。很少有命令可以按常规意义扩展通配符-例如,unzip和7z可以使用它来打开多个存档(例如,其参数通常采用“ [archive filename single argument] [list of files to extract]” 形式)。
Random832 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.