2012-04-17 63 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