2012-04-17 90 views

回答

14

任意語法不能做任何事情。圓括號是元字符,它們對解析器有特殊的含義,因此您無法使用它們作爲有效的名稱。擴展shell的最好方法是定義函數。

這將是一個基本echo包裝,始終寫入同一個文件:

f() { 
    echo "[email protected]" 
} >a.txt 

這達到同樣的效果,但還處理標準輸入 - 犧牲echo's-e-n選項:

f() { 
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}" 
} >a.txt 

其可稱爲

f arg1 arg2... 

f <file 

功能都在相同的方式與任何其它命令傳遞的參數。

第二個類似echo的包裝首先測試set first argument或來自非tty的stdin,並使用定位參數(如果設置)或stdin有條件地調用printf。測試表達式避免了零參數和不從文件重定向的情況,在這種情況下,Bash會嘗試擴展終端的輸出,掛起shell。

+0

+1,很好的答案。你會介意更詳細地解釋爲什麼你使用更復雜(但更好)的構造來輸出參數嗎? – Kaii 2012-04-17 07:31:56

+0

它只允許來自stdin或參數的輸入。測試表達式可以防止出現零參數和stdin來自終端的情況,在這種情況下,因爲進程自己的tty正在讀取和阻止,所以shell將不得不被終止。如果通過,那麼位置參數將被放大(如果已設置),或者擴展將從函數的輸入中讀取。使用'cat'可以實現稍微更便攜但更慢的解決方案 - 這需要一個具有真正的/ dev/fd/*的系統。自從我之前的回答與其他回答相同以來,我只是發佈了這個技巧。 :) – ormaaj 2012-04-17 08:07:59

+0

也,它確實允許*多個參數*就像'echo'一樣。你的函數使用'f一二三',而其他函數只能用'f'一二三''工作。考慮到沒有qotes的輸入,其他解決方案只考慮第一個詞(這裏:「one」)。 – Kaii 2012-04-17 08:11:00

4
F() { 
    echo "$1" > a.txt 
} 

你不你打電話時不用括號。這是你如何稱呼它:

F "text to save" 
3

是的,只有你應該F sth叫它:

F() 
{ 
    echo "$1" > a.txt 
} 

更多here