如何读取/查看bash函数的内容?

如何读取/查看bash函数的内容?

我们总是可以alias通过使用命令来查看值alias

wolf@linux:~$ alias al='grep "$1" file.txt'
wolf@linux:~$ alias al
alias al='grep "$1" file.txt'
wolf@linux:~$ 

不幸的是,grep不适用于别名。不知道出了什么问题。如果您知道问题和解决方案,请告诉我。

wolf@linux:~$ al
random text
abc def jkl
random text
abc ghi jkl
random text
wolf@linux:~$ 

wolf@linux:~$ al abc
file.txt:random text
file.txt:abc def jkl
file.txt:random text
file.txt:abc ghi jkl
file.txt:random text
grep: abc: No such file or directory
wolf@linux:~$ 

所以我决定使用函数。

wolf@linux:~$ func(){ grep "$1" file.txt; }
wolf@linux:~$ func
random text
abc def jkl
random text
abc ghi jkl
random text
wolf@linux:~$ 

有用。

wolf@linux:~$ func abc
abc def jkl
abc ghi jkl
wolf@linux:~$ 

但现在还有一个问题,我定义了几个函数,却忘记了它们的内容。

有没有办法查看函数的内容,可能与alias al上面的命令类似?

答案1

type NAME(或者type -a NAME 如果使用相同名称定义了多个命令)将执行以下操作:

$ func(){ grep "$1" file.txt; }
$ type func
func is a function
func () 
{ 
    grep --color=auto "$1" file.txt
}

答案2

查看函数运行的代码set

您的别名不起作用,因为$1在别名中不起作用。别名只是文本替换,它们不是函数。所以如果你有别名

alias foo='bar "$1" baz'

然后foo在命令行中输入,shell 的行为就像您输入bar "$1" baz.如果你输入foo somethingshell 将执行bar "$1" baz something而不是bar something baz.

答案3

这将是一个离题的答案。使grep别名在没有函数的情况下工作。

借用并改编自这个 stackoverflow 帖子:

alias al='grep file.txt -f - <<<'

然后:

$ cat file.txt
aaa
bbb
ccc
$ al a
aaa

告诉-f -grep 使用文件中的表达式,但由于这里的文件是-,所以表达式是从 stdin 读取的。然后我们使用 bash here-string 将字符串的内容重定向到标准输入。这允许grep将表达式放置在命令的末尾,这正是别名发挥作用所需要的。

相关内容