如何正確轉義單引號建立別名

如何正確轉義單引號建立別名

我得到了這一行來了解我的進程消耗了多少記憶體。

$ ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'

現在我想為該命令創建一個別名,但遇到轉義'字元的問題:

$ alias mm=ps -u $USER -o pid,rss,command | \
    awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB

我試圖轉義單引號,但仍然不起作用。

$ alias mm='ps -u $USER -o pid,rss,command | \
    awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
> 

您能幫我了解如何建立此別名嗎?

答案1

要使其成為別名(這是可能的),您需要在別名的整個值周圍使用雙引號。因此,您還需要轉義別名中的一些內容,並且需要轉義任何欄位參數,awk因為當您設定別名時,這些參數也會被 Bash 解釋為參數。

這對我有用:

$ alias mm="ps -u $USER -o pid,rss,command | \
    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"

在上面我做了以下事情:

  1. 別名值用雙引號引起來

    alias mm="ps -u ...."
    
  2. 轉義 awk 的雙引號

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. 轉義 awk 的字段

    awk '{print \$0}{sum+=\$2} END
    

我會用這個嗎?

可能不會,我會將其切換為 Bash 函數,因為它會更容易維護和理解正在發生的事情,但如果您仍然需要它,這裡是別名。

答案2

您能幫我了解如何建立此別名嗎?

如果您使用 bash,我可以建議您建立一個函數並將其放入 .bashrc 中嗎?

mm() {
  ps -u "$USER" -o pid,rss,command |
    awk '{print $0}{sum+=$2}
         END {print "Total", sum/1024, "MB"}'
}

如果是bash,則需要引用變數。在一個函數中,無需將所有內容都放在一行中。

答案3

這是轉義命令:

alias mm='ps -u $USER -o pid,rss,command | \
    awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'

shell 中轉義引號的範例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

只要完成已開啟的一個 ( '),放置轉義的一個 ( \'),然後開啟另一個 ( ') 即可。

或者:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

這是透過完成已開啟的一個 ( '),將引號放入另一個引號 ( "'"),然後開啟另一個 ( ') 來完成的。

有關的:如何轉義單引號字串中的單引號?在 stackoverflow SE

相關內容