我有 3 个文件:test1、test2、test3.sh。文件 test3.sh 的内容为文件 test1 和 test2 的名称。我无法理解以下命令输出的结果:
sh-4.3$ touch test1 test2
sh-4.3$ ls
main.sh test1 test2
sh-4.3$ cat > test3.sh
test1
test2
sh-4.3$ cat test3.sh
test1
test2
sh-4.3$ ls
main.sh test1 test2 test3.sh
sh-4.3$ ls | grep test*
test3.sh:test1
上面的 grep 命令给出了 test3.sh 文件中的匹配文本,但是 ls 命令的输出结果如何呢?因为它也包含单词“test”。shell 在进行模式搜索时是否忽略了 ls 命令的输出?
答案1
shell 会将你扩展*
到当前目录中所有匹配的文件,然后才能grep
看到它,所以扩展后的命令是
grep test1 test2 test3.sh
grep
将第一个参数解释test1
为要搜索的模式,将其他的参数解释为要查找的文件的名称。 的输出ls
作为文本传递到的 STDIN 而不是文件名,并且似乎这被忽略了,因为在扩展完成后,grep
它在 的语法中没有意义。grep
始终引用你的正则表达式
$ ls | grep 'test*'
test1
test2
test3.sh