别名 grep 引用用法

1 shell grep alias bashrc

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

alias ip_usage='sudo grep "$1" /srv/logs/httpd/chris-server.com/access.log'
Run Code Online (Sandbox Code Playgroud)

我的外壳用法是:

ip_usage 192.168.0.0
Run Code Online (Sandbox Code Playgroud)

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

我也尝试反转引用用法,但性能是一样的。

alias ip_usage="sudo grep '$1' /srv/logs/httpd/chris-server.com/access.log"
Run Code Online (Sandbox Code Playgroud)

跑步:

sudo grep '192.168.0.0' /srv/logs/httpd/chris-server.com/access.log
Run Code Online (Sandbox Code Playgroud)

带回我想要的记录,所以它与我的报价和传入的值有关。

Joh*_*024 5

引用的第一个版本是正确的,只是别名不符合您的要求。你需要一个函数:

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

文档

来自man bash

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

换句话说,别名进行字符串替换。它们不支持对参数的操作。因此,$1不支持在别名 via 内引用第一个参数。

也来自man bash

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

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

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

让我们定义一个别名

$ alias e='echo $1'
Run Code Online (Sandbox Code Playgroud)

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

$ set -- 
$ e a b c
a b c
Run Code Online (Sandbox Code Playgroud)

它做了人们可能希望的事情。

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

$ set -- First
$ echo "$1"
First
Run Code Online (Sandbox Code Playgroud)

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

$ e a b c
First a b c
Run Code Online (Sandbox Code Playgroud)

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