Bash
如何在傳遞給 bash 函式之前評估 bash 別名?
我已將測試別名定義為:
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 sametestalias
,並保持不變。它可能會給你一個關於 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
命令時找到。