簡體   English   中英

在bash別名文件中轉義帶引號的字符串

[英]Escaping a string with quotes in bash alias file

我想在我的~/.bash_aliases文件中輸入以下命令:

grep screen /var/log/auth.log|grep "$(date|awk '{print $2" "$3}')"

我嘗試將以下內容放入別名文件中:

alias unlocks=grep screen /var/log/auth.log|grep "$(date|awk '{print $2" "$3}')"

但我得到以下信息:

bash:別名:屏幕:找不到

bash:別名:/var/log/auth.log:找不到

大概是因為命令字符串中有空格,通常可以通過引用整個字符串來解決空格,但是我已經使用了兩種類型的引號,而且我無法弄清楚如何正確地對它們進行轉義。

請有人幫忙嗎?

不要試圖將復雜的東西作為別名。 而是在.bashrc定義一個函數。

unlocks () {
    grep screen /var/log/auth.log | grep "$(date +"%b %d")"
}

另外,當您可以直接調整date的輸出時,請不要使用awk 但是,您可以使用awk替換兩個grep實例:

unlocks () {
     awk -v date=$(date +"%b %d") '/screen/ && $0 ~ date' /var/log/auth.log
}

alias foo="my command with\\"quotes\\""大多數情況下, alias foo="my command with\\"quotes\\""應正常工作

編輯:由於bash將評估字符串,因此您還需要轉義其他特殊字符,例如$

在您的情況下: alias unlock="grep screen /var/log/auth.log|grep \\"\\$(date|awk '{print \\$2\\" \\"\\$3}')\\""應該可以解決問題。

有一個簡單的方法和一個困難的方法。

最簡單的方法:把代碼放到稱為腳本文件unlocks里面的文件夾$HOME/bin 在大多數系統中,該文件夾被添加到路徑中。 使用chmod +x $HOME/bin/unlocks使腳本可執行。

困難的方法:您可以使用嵌套的引號,但是它很難看,易碎,而且...我不建議這樣做。 但是,如果必須的話,它將如下所示:

alias unlocks='grep screen /var/log/auth.log|grep "$(date|awk '"'"'{print $2" "$3}'"'"')"'

要在單個帶引號的字符串中獲得單個嵌套的單引號,您需要'"'"'第一個對號結束當前字符串。 "'"為您提供單引號,shell將在其后附加當前字符串。 然后最后一個滴答聲繼續該字符串。

alias unlocks="..."

在這種情況下將不起作用,因為它將立即運行date|awk '{print $2" "$3}'並將結果放入別名中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM