我在读下面的教程扩展在Linux中
http://linuxcommand.org/lc3_lts0080.php
它说,关于双引号:
双引号
第一种类型的报价,我们将看看是双引号。 如果您将文本置于双引号内,则shell 使用的所有特殊字符将失去其特殊含义并被视为普通字符。例外是“$”, “\”(反斜杠)和“`”(反引号)。这意味着字分割,路径名扩展,波形扩展和大括号扩展被抑制,但是仍然执行参数扩展, 算术扩展和命令替换。
而关于单引号:
单引号
如果需要抑制所有的扩展,可以使用单引号。
它说明,与ls
为什么只有*.txt
工作不"*.txt"
或'*.txt'
$ ls -l *.txt
-rw-r--r-- 1 Gaurav None 8893 Apr 17 06:25 BigText.txt
-rwxr-xr-x 1 Gaurav None 54376 Apr 18 12:32 File.txt
-rw-r--r-- 1 Gaurav None 371 Apr 23 21:04 Filelist.txt
-rwxr-xr-x 1 Gaurav None 54386 Apr 18 12:28 FileOld.txt
-rw-r--r-- 1 Gaurav None 1163 Apr 17 06:19 Read.txt
-rw-r--r-- 1 Gaurav None 651 Apr 24 06:28 temp.txt
$ ls -l "*.txt"
ls: cannot access *.txt: No such file or directory
$ ls -l '*.txt'
ls: cannot access *.txt: No such file or directory
我的问题是,随着find or grep
为什么"*.txt", '*.txt'
都提供了扩展:(其实*.txt
没有提供任何扩展为名称而不是ls
)
eg
$ find . -name *.txt
find: paths must precede expression: File.txt
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
$ find . -name "*.txt"
./BigText.txt
./File.txt
./Filelist.txt
./FileOld.txt
./Read.txt
./sample/BigText.txt
./sample/File.txt
./sample/FileOld.txt
./sample/Read.txt
./sample/temp.txt
./temp.txt
$ find . -name '*.txt'
./BigText.txt
./File.txt
./Filelist.txt
./FileOld.txt
./Read.txt
./sample/BigText.txt
./sample/File.txt
./sample/FileOld.txt
./sample/Read.txt
./sample/temp.txt
./temp.txt
根据您的输出,扩展由shell正确处理。 '*'在双引号内失去意义,因此当作为参数传递给任何命令时,将不会被扩展。 'find'在'-name'之后需要'pattern',因此需要使用quote或shell会扩展表达式并导致语法错误。 – alvits