为什么函数ls {ls; }挂在那里?

易卜拉欣·古拉什|

以下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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么不在那里调用普通函数?

来自分类Dev

VSCode Debugger 只是坐在那里什么也不做

来自分类Dev

为什么“ ls *”比“ ls”花费更长的时间?

来自分类Dev

为什么ls -i比ls慢?

来自分类Dev

xinitrc的奥秘-那里可以有什么,不能在那里有什么

来自分类Dev

为什么Rails 4会说缺少帮助文件,尽管它在那里?

来自分类Dev

重新绘制窗口后,为什么角色的阴影仍保留在那里?

来自分类Dev

为什么libnettle 2.7.1的.configure找不到-lgmp,即使它在那里?

来自分类Dev

为什么我会收到“ -bash:'alias:命令未找到”,但它在那里..?

来自分类Dev

Cookie在那里,但我无法在CodeIgniter中获得它们。为什么?

来自分类Dev

守卫声明后预期else,但else在那里,为什么抱怨?

来自分类Dev

“ parcella_pk”在那里不行,它导致“ ValueError”。我应该使用什么?

来自分类Dev

〜/ .config指的是什么以及如何将文件放在那里?

来自分类Dev

github 的想法是什么,这些 .zip 文件开发人员在那里共享?

来自分类Dev

什么是ls -F(ls --classify)

来自分类Dev

为什么ls -l输出的大小与ls -s不同?

来自分类Dev

为什么vim有时显示^ M而有时不显示(即使它们在那里)?

来自分类Dev

如何防止Meteor / Cordova App连接到10.0.2.2?(为什么应用程序在那里连接?)

来自分类Dev

为什么vim有时显示^ M,有时却不显示(即使它们在那里)?

来自分类Dev

为什么我们在那里使用一个monoid和一个函子?

来自分类Dev

为什么我断言元素包含某个字符串失败,即使它在那里?

来自分类Dev

为什么即使我在那里安装了应用程序,我的所有 snap 目录都是空的?

来自分类Dev

为什么“ ls> ls.out”会导致“ ls.out”包含在名称列表中?

来自分类Dev

ls为什么不显示组名?

来自分类Dev

为什么ls接受重复的开关?

来自分类Dev

为什么“ head / bin / ls”重置终端

来自分类Dev

为什么我不能执行ls -a 1>&-?

来自分类Dev

为什么ls -R称为“递归”列表?

来自分类Dev

删除函数,而不是使用弃用的注解使其保留在那里是一种好习惯吗?

Related 相关文章

  1. 1

    为什么不在那里调用普通函数?

  2. 2

    VSCode Debugger 只是坐在那里什么也不做

  3. 3

    为什么“ ls *”比“ ls”花费更长的时间?

  4. 4

    为什么ls -i比ls慢?

  5. 5

    xinitrc的奥秘-那里可以有什么,不能在那里有什么

  6. 6

    为什么Rails 4会说缺少帮助文件,尽管它在那里?

  7. 7

    重新绘制窗口后,为什么角色的阴影仍保留在那里?

  8. 8

    为什么libnettle 2.7.1的.configure找不到-lgmp,即使它在那里?

  9. 9

    为什么我会收到“ -bash:'alias:命令未找到”,但它在那里..?

  10. 10

    Cookie在那里,但我无法在CodeIgniter中获得它们。为什么?

  11. 11

    守卫声明后预期else,但else在那里,为什么抱怨?

  12. 12

    “ parcella_pk”在那里不行,它导致“ ValueError”。我应该使用什么?

  13. 13

    〜/ .config指的是什么以及如何将文件放在那里?

  14. 14

    github 的想法是什么,这些 .zip 文件开发人员在那里共享?

  15. 15

    什么是ls -F(ls --classify)

  16. 16

    为什么ls -l输出的大小与ls -s不同?

  17. 17

    为什么vim有时显示^ M而有时不显示(即使它们在那里)?

  18. 18

    如何防止Meteor / Cordova App连接到10.0.2.2?(为什么应用程序在那里连接?)

  19. 19

    为什么vim有时显示^ M,有时却不显示(即使它们在那里)?

  20. 20

    为什么我们在那里使用一个monoid和一个函子?

  21. 21

    为什么我断言元素包含某个字符串失败,即使它在那里?

  22. 22

    为什么即使我在那里安装了应用程序,我的所有 snap 目录都是空的?

  23. 23

    为什么“ ls> ls.out”会导致“ ls.out”包含在名称列表中?

  24. 24

    ls为什么不显示组名?

  25. 25

    为什么ls接受重复的开关?

  26. 26

    为什么“ head / bin / ls”重置终端

  27. 27

    为什么我不能执行ls -a 1>&-?

  28. 28

    为什么ls -R称为“递归”列表?

  29. 29

    删除函数,而不是使用弃用的注解使其保留在那里是一种好习惯吗?

热门标签

归档