在 csh/tcsh 中,如何將文字花括號合併到使用 eval 處理的指令中?

在 csh/tcsh 中,如何將文字花括號合併到使用 eval 處理的指令中?

更詳細地說,情況是這樣的。

我正在嘗試準備模組檔案(即環境模組包使用的類型)來為第三方軟體設定環境和別名。尤其是一些別名讓我感到悲傷。作者提供的 shell 資源檔案——我希望擺脫和轉向與 shell 無關的環境,因此我對模組檔案感興趣——設定包含文字大括號的別名。當我嘗試將相同的字串放入模組檔案中時,花括號的內容就會展開。

似乎在 csh/tcsh 中,模組檔案的 set-alias 命令被處理並轉換為 shell 提供的「別名」命令。然後使用 eval 對其進行處理,如下所示:

eval `alias foo 'thing to alias foo to';`

(是的,結尾的分號是命令的一部分)。

如果不編譯自訂版本的模組,我就無法擺脫任何這些元素——eval、評估的字串周圍缺少雙引號,或者別名文字周圍的單引號——而我不願意編譯自訂版本的模組做。

現在,如果別名包含大括號,我看不到如何在 eval 語句的上下文中保護它們,以便它們不被解釋。我已經嘗試過從這裡到廷巴克圖的反斜杠,我已經嘗試過雙引號,我已經嘗試過單引號,我已經嘗試過雙引號內的單引號,我已經嘗試過上述的組合。到目前為止,還沒有任何效果,這近乎荒謬。儘管進行了廣泛的谷歌搜索,我仍然無法找到任何答案。

有沒有辦法擺脫花括號?如果沒有,請告訴我,我會繼續我的生活;如果是這樣,並且不涉及任何重新編譯,我將非常感謝任何建議。謝謝!

答案1

我的 tcsh/csh 解決方案有點冗長。就是把「{」貼到一個單獨的變數中。

  set lc="{"
  set rc="}"

我對美元符號做了同樣的事情,但我很難逃脫。對於 grep 正規表示式非常有用。

這是我從 .cshrc 剪下/貼上的內容:

  set dollar = \$

正如我所說,使用結果很冗長,但至少有效:

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

請注意,您需要這些額外的引號。

希望這可以幫助!

答案2

另一個解決方案:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

044、173 和 175 是 ascii 字元 $、{ 和 } 的八進位代碼

答案3

使用2 個單引號用於保護(轉義)花括號。當您回顯該變數時,您可能需要一個雙引號 ("):

set a=''{''
echo "$a"

此外,反引號 ( ) 內的 echo 可以與轉義括號一起使用:

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

相關內容