Bash

如何在傳遞給 bash 函式之前評估 bash 別名?

  • September 18, 2021

我已將測試別名定義為:

alias testalias='python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")"'

當我直接通過終端執行它時它工作正常。我可以正常 cat /tmp/testopenfile 。我還定義了一個輔助函式來後台和靜音程序的錯誤和輸出。我想過將此函式與一些需要很長時間或在 while 循環中的別名一起使用(不是這個僅作為範例)。它是這樣定義的:

detach is a function
detach ()
{
   $1 > /dev/null 2> /dev/null &
}

我正在使用 bash,我試圖將這兩件事結合起來。當我嘗試detach testalias時,它似乎不起作用(/tmp/testopenfile 似乎沒有被創建)。看起來 testalias 是直接通過而不是評估的。在通過之前進行此評估的技巧是什麼。

此外,此程式碼創建文件:

python3 -c "f = open(\"/tmp/testopenfile\", \"w+\"); f.write(\"hi\n\")" 1>/dev/null 2>/dev/null &

用函式替換別名。

testalias() {
   python3 -c 'f = open("/tmp/testopenfile", "w+"); f.write("hi\n")'
}
detach ()
{
   "$@" > /dev/null 2> /dev/null &
}

Bash 僅查看命令的第一個單詞以進行別名擴展,因此該函式獲取文字參數testalias。(我認為 zsh 有“全域”別名,可以在命令行的任何地方展開,但我懷疑你是否想要echo testalias展開別名內容。)

別名擴展也發生在解析過程的早期,方法 before$1被擴展,所以當函式執行時,$1擴展為 just same testalias,並保持不變。它可能會給你一個關於 not found the command 的錯誤testalias,除了 stderr 被重定向到/dev/null,所以你看不到錯誤。

事實上,函式中的別名是在解析函式時展開的,而不是在使用時展開。

$ alias foo="echo abc"
$ f() { foo; }
$ alias foo="echo def"
$ g() { foo; }
$ f
abc
$ g
def

使用testalias函式,查找testalias命令時找到。

引用自:https://unix.stackexchange.com/questions/669619