Bash
我需要將一系列通過管道傳輸的命令轉換為 .bashrc 中的別名
sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
從終端執行上述命令時,會輸出正確的“內部”IP 地址。當我嘗試作為別名傳遞時:
alias intip='sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}''
我收到以下錯誤:
alias: addr: | cut -d: -f2 | awk { not found alias: print not found alias: } not found
我在這裡做錯了什麼?
在重要的地方使用雙引號和單引號:
alias lsa="ls -l | awk '{print \$1}' "
您做錯的事情是使用別名比為命令提供更短的名稱或自動將參數傳遞給命令更複雜。改用函式,您不必擔心引用。
intip () { /sbin/ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}' }
請注意,這裡不需要 sudo,
ifconfig
僅查看時不需要特權。但在許多發行版中,您需要提供完整路徑,因為非 root 使用者ifconfig
的預設設置通常不是這樣。PATH
順便說一句,您可以完全在 awk 中進行過濾,但如果您覺得這樣更舒服,可以隨意使用多種工具。這是一種方法:
intip () { /sbin/ifconfig wlan0 | awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}' }
您可以輕鬆地將介面名稱作為函式的可選參數。
intip () { /sbin/ifconfig "${1:-wlan0}" | awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}' }
只是為了說明為什麼您的別名不起作用:您有單引號來分隔別名和別名文本內。口譯員無法讀懂您的想法,也無法看出哪些是本意。請參閱Calling bash from sh (dash) with commands read from args, and “Unterminated quoted string”/“unexpected EOF” for some quotes-inside-quotes case and Why is echo ignoring my quote characters?了解如何通過輸入四個字元有效地在單引號字元串中包含單引號
'\''
。