Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在脚本中,查找抛出路径必须位于表达式之前_Linux_Bash_Shell_Find_Grep - Fatal编程技术网

Linux 在脚本中,查找抛出路径必须位于表达式之前

Linux 在脚本中,查找抛出路径必须位于表达式之前,linux,bash,shell,find,grep,Linux,Bash,Shell,Find,Grep,我试图将find和grep化名为一行,如下所示 alias f='find . -name $1 -type f -exec grep -i $2 '{}' \;' 我打算把它当作 f *.php function 但当我把它添加到.bash_配置文件并运行它时,我会被它击中 [a@a ~]$ f ss s find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression] 我如何解决这

我试图将find和grep化名为一行,如下所示

alias f='find . -name $1 -type f -exec grep -i $2 '{}' \;'
我打算把它当作

f *.php function
但当我把它添加到.bash_配置文件并运行它时,我会被它击中

[a@a ~]$ f ss s
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

我如何解决这个问题

别名不接受位置参数。您需要使用一个函数

f () { find . -name "$1" -type f -exec grep -i "$2" '{}' \; ; }
你还需要引用你的一些论点

f '*.php' function

这延迟了全局的扩展,以便
find
执行它,而不是shell。

扩展Dennis Williamson的解决方案:

f() { find . -name "$1" -type f -print0 | xargs -0 grep -i "$2"; }

使用
xargs
而不是
-exec
可以避免为每个grep生成新进程。。。如果您有很多文件,那么开销可能会有所不同。

使用
+
而不是
\,可以获得相同的效果用于支持它的find版本。运气不好,我在.bash_配置文件中添加了
函数f(){find.-name“$1”-键入f-print0 | xargs-0 grep-I“$2”}
,并将其作为源代码。点击相同的错误
[a@a~]$f“*.php”函数find:路径必须在表达式用法之前:find[-H][L][P][path…][expression]
@QuintinPar:您的注释中的函数定义和执行对我来说没有错误。仔细检查,确保您实际尝试的内容与您发布的内容相符。另外,请尝试
declare-f
显示函数定义以进行验证。此外,在使用()定义函数时,不必使用function关键字(反之亦然)。Bash是少数几个同时接受它们的shell之一。@quinton:您需要用单引号中的第一个参数调用f。使用双引号是非常不同的。@williampersell:只有在有变量或参数展开时才使用。对于globbing,双引号和单引号之间没有区别。与globbing有表面相似性的特殊参数
$*
$?
将在双引号内展开,除非转义美元符号(如果您正在查找名称中该位置带有文字美元符号的文件)或将规范括在单引号内。在单引号或双引号的情况下,如果要查找包含文字星号的文件名,则需要对其进行转义。上述所有操作也适用于方括号字符列表或范围全局搜索功能。