我的有這個功能~/.zshrc
async () {
if ! [[ $# -gt 0 ]];then
echo "Not enough arguments!"
fi
local busus="$IFS"
export IFS=" "
echo "$* &"
command "$* &"
export IFS="$busus"
}
和一個別名
alias word='async "libreoffice --writer"'
該echo "$* &"
行僅用于除錯。當我運行時word
,libreoffice --writer &
螢屏上顯示(沒有多余的空格或換行符),但沒有任何反應。我也嘗試過執行command libreoffice --writer &
并且效果很好。(我現在的shell是zsh)有什么問題?
謝謝
uj5u.com熱心網友回復:
通常(尤其是在 bash 中),問題是人們沒有使用足夠的雙引號;在這種情況下,情況正好相反:您使用了太多的雙引號。基本問題是命令名稱和它的每個引數都必須是一個單獨的“單詞”(在 shell 語法中),但是雙引號(通常)會使 shell 將其視為一個單詞。這是一個快速演示:
% echo foo
foo
% "echo foo"
zsh: command not found: echo foo
在這里,雙引號使 shell 將“foo”視為命令名稱的一部分,而不是作為分隔符和命令名稱后面的引數。類似地,當您使用 時"$* &"
,雙引號告訴 shell 將整個事物(甚至包括與號)視為一個長單詞(并將其作為引數傳遞給command
)。(順便說一句,command
不需要,但也不會造成任何傷害。)
做到這一點的標準方法是使用"$@"
- 這里的$@
行為特別在雙引號內,使每個引數成為一個單獨的單詞。在 zsh 中,您可以省略雙引號,但這會在其他 shell 中引起問題,因此我建議還是使用它們。
另外,不要亂來IFS
。您不需要這樣做,它會打開一罐最好關閉的蠕蟲。如果沒有引數,您應該return
立即,而不是繼續并嘗試運行一個空命令。
但是還有另一個問題:在別名中,您使用雙引號"libreoffice --writer"
,這將再次產生幾乎相同的效果。所以洗掉那些雙引號。但是在別名周圍保留單引號,因此它將被定義為單個別名。
所以這是我建議的更正:
async () {
if ! [[ $# -gt 0 ]];then
echo "Not enough arguments!"
return 1 # Do not continue if there's no command to run!
fi
echo "$* &" # Here quoting is appropriate, so it's a single argument to echo
"$@" &
}
alias word='async libreoffice --writer'
uj5u.com熱心網友回復:
直接使用"$@"
更可靠:
async () { [ "$#" -gt 0 ] && "$@" & }
alias word='async libreoffice --writer'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487314.html