![如何读取/查看bash函数的内容?](https://linux22.com/image/188119/%E5%A6%82%E4%BD%95%E8%AF%BB%E5%8F%96%2F%E6%9F%A5%E7%9C%8Bbash%E5%87%BD%E6%95%B0%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F%20.png)
我们总是可以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 something
shell 将执行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
将表达式放置在命令的末尾,这正是别名发挥作用所需要的。