Shell

別名 grep 引用用法

  • November 17, 2017

我正在嘗試在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

把我想要的記錄帶回來,所以它是我的報價和傳入的值。

引用的第一個版本是正確的,只是別名不符合您的要求。你需要一個函式:

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

文件

來自man bash

當字元串用作簡單命令的第一個單詞時,別名允許將字元串替換為單詞。

換句話說,別名進行字元串替換。它們不支持對參數的操縱。$1因此,不支持在別名 via 中引用第一個參數。

也來自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 的第一個參數,而不是別名的第一個參數。

引用自:https://unix.stackexchange.com/questions/405348