以下Shell函数定义挂在Cygwin的bash控制台(RHEL / Ubuntu)中,仅在调用终端时退出终端。
$ function ls { ls; }
$ ls
这种行为有任何原因吗?
您定义的ls
命令是递归调用自身而不是先前的 ls
命令。
如果ls
要从重新定义的名称中调用实际which
名称,则可以简单地使用来获取完整的路径名,例如重新定义ls
以提供长格式:
function ls { $(which ls) -l; }
实际上与以下内容相同:
function ls { /bin/ls -l; }
不会给您的解决方案递归带来问题。
另一种选择是使用
function ls { command ls -l; }
command
将禁止shell函数查找,并且仅允许路径中的内置程序或程序。
内置程序(如cd
)的处理方式与程序略有不同,因为它们实际上并不位于文件系统上。在这种情况下,您可以使用builtin
而不是which
来调用内置版本。
如果要根据可能已经是函数的东西来定义函数,那会有些棘手。您可以declare -f
用来获取当前定义,然后对其进行操作以创建一个新定义。
下面是一个示例(尽管做作)。假设您声明了一个显示所有文本文件的函数:
pax> showtxt()
...> {
...> ls *.txt
...> }
现在您要给它一个漂亮的标题。使用declare -f showtxt
,您可以看到其定义:
pax> declare -f showtxt
showtxt ()
{
ls *.txt
}
运行该命令可能会导致以下输出:
pax> showtxt
passwords.txt p0rnsites.txt results.txt
现在说您想更改它的标题。您可以捕获的输出declare -f
并对其进行修改以创建一个脚本,该脚本将重新定义函数,从而:
pax> declare -f showtxt | awk '$1=="ls"{print "echo Text files:"}{print}' >tmp.sh
pax> cat tmp.sh
showtxt ()
{
echo Text files:
ls *.txt
}
您可以看到您现在具有修改后的函数定义,该定义在运行时将替换该函数:
pax> . ./tmp.sh
pax> declare -f showtxt
showtxt ()
{
echo Text files:;
ls *.txt
}
而且,当您运行新功能时,其行为已更改:
pax> showtxt
Text files:
passwords.txt p0rnsites.txt results.txt
现在这个人为的例子并没有那么有用,因为您可能自己输入了。当原始功能更复杂或您要对其进行的更改是多种多样时,这很方便。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句