Linux 在脚本中,查找抛出路径必须位于表达式之前
我试图将find和grep化名为一行,如下所示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] 我如何解决这
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有表面相似性的特殊参数$*
和$?
将在双引号内展开,除非转义美元符号(如果您正在查找名称中该位置带有文字美元符号的文件)或将规范括在单引号内。在单引号或双引号的情况下,如果要查找包含文字星号的文件名,则需要对其进行转义。上述所有操作也适用于方括号字符列表或范围全局搜索功能。