Shell
別名 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
把我想要的記錄帶回來,所以它是我的報價和傳入的值。
引用的第一個版本是正確的,只是別名不符合您的要求。你需要一個函式:
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 的第一個參數,而不是別名的第一個參數。