grep无效

发布于 2022-09-11 15:54:18 字数 375 浏览 44 评论 0

执行如下命令:

ps aux|grep -n redis-server|grep -v grep

能正常找到redis-server的进程信息。
(注:grep -v grep是为了在结果中排除掉grep自身的进程信息)

但是写成别名:

alias pg="ps aux|grep -n $@|grep -v grep"

然后再执行:

pg redis-server

提示如下:

grep: redis-server: No such file or directory

请问是哪里错了?谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

|煩躁 2022-09-18 15:54:18

其实你这样不行纯粹是因为你用了双引号,双引号在alias的时候已经将位置函数$@展开了,当然值就传递不进去了,不信你换成单引号试试....

锅了,锅了,确实不行哈,昨天晚上在家没法验证,有点想当然了。早上来公司了~那么来探究一下,为啥不生效吧。

在 bash 的 man 文档中关于位置参数有这样一句话:

The positional parameters are temporarily replaced when a shell function is executed (see Shell Functions).
当 shell 函数执行时,位置参数将被临时替换

也就是说,当没有调用函数时,位置变量始终是启动 bash 时传递的参数,默认是空值。

楼上老哥的回答中,不使用位置参数也同样生效

alias pg='ps aux|grep -v grep| grep -n'

如果想要使用位置参数,可以使用函数式写法,或利用函数写入别名,source之后直接使用

# .bashrc
pg(){ ps aux|grep -n $@ | grep -v grep; }
# 如果需要别名用法,同样利用函数调用
alias pg='f(){ ps aux | grep -n $@ | grep -v grep;}; f'

当然直接更换位置,向楼上老哥的写法也是 OK 的。

不交电费瞎发啥光 2022-09-18 15:54:18

把顺序掉换一下就好了

alias pg='ps aux|grep -v grep| grep -n $@'

对于$@来讲, 符号后面的都是参数

$ alias pg="ps aux|grep -n $@|grep -v grep"
$ set -x  #开启bash调试模式
++ update_terminal_cwd
++ local url_path=
...

$ pg abc
+ ps aux
+ grep -n
+ grep -v grep abc
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]
grep: abc: No such file or directory
++ update_terminal_cwd
++ local url_path= 

可以看出, pg abc执行的结果是

ps aux
grep -n
grep -v grep abc

即, grep -v grep也是$@代表的一部分,被 bash 解析代入了.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文