我正在尝试在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)
带回我想要的记录,所以它与我的报价和传入的值有关。
引用的第一个版本是正确的,只是别名不符合您的要求。你需要一个函数:
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 函数确实支持位置参数。
让我们定义一个别名
$ 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 的第一个参数,而不是别名的第一个参数。