别名 grep 引用用法

别名 grep 引用用法

我正在尝试在文件中创建别名,bashrc但遇到问题。我想要命令访问grep我们服务器的特定 IP 地址的访问日志。我当前的条目是:

alias ip_usage='sudo grep "$1" /srv/logs/httpd/chris-server.com/access.log'

我的外壳用法是:

ip_usage 192.168.0.0

但这会带回访问日志中的所有记录。

我还尝试反转引用用法,但性能是相同的。

alias ip_usage="sudo grep '$1' /srv/logs/httpd/chris-server.com/access.log"

跑步:

sudo grep '192.168.0.0' /srv/logs/httpd/chris-server.com/access.log

带回我想要的记录,所以它是带有我的引号和传入的值的东西。

答案1

引用的第一个版本是正确的除了别名不能做你想做的事。你需要一个函数:

ip_usage() { sudo grep "$1" /srv/logs/httpd/chris-server.com/access.log; }

文档

man bash

别名允许在用作简单命令的第一个单词时用字符串替换单词。

换句话说,别名进行字符串替换。他们不支持操纵参数。因此,$1不支持通过别名引用第一个参数。

也来自man bash

shell 函数(如上面 SHELL GRAMMAR 中所述定义)存储一系列命令以供以后执行。当 shell 函数的名称用作简单命令名称时,将执行与该函数名称关联的命令列表。函数在当前 shell 的上下文中执行;没有创建新进程来解释它们(与 shell 脚本的执行进行对比)。当执行函数时,函数的参数在其执行期间成为位置参数。更新特殊参数 # 以反映更改。特殊参数0 不变。当函数执行时,FUNCNAME 变量的第一个元素设置为函数的名称。

换句话说,bash 函数确实支持位置参数。

旁白:为什么末尾带有 $1 的别名似乎有效

让我们定义一个别名

$ alias e='echo $1'

现在,让我们清除 shell 的位置参数并运行别名:

$ set -- 
$ e a b c
a b c

它确实达到了人们所希望的效果。

但请注意,这里有一个陷阱。让我们设置 shell 的第一个位置参数:

$ set -- First
$ echo "$1"
First

现在,让我们再次运行我们的命令:

$ e a b c
First a b c

在这里,很明显,$1别名是指第一个 shell 的第一个参数,而不是别名的第一个参数。

相关内容