我只是想知道在 bash shell 脚本中调用$(one_function)
和函数的区别。one_function
PS1
当我在中设置变量时~/.bashrc
,我无法通过one_func
以下方式调用该函数:
export PS1="\n\[\e[31m\] \$(one_func) # it works
export PS1="\n\[\e[31m\] one_func # it doesn't work
答案1
与访问变量的方式相反,函数通过名称调用,而不必在名称前面加上“$”。
您可能对如何在命令行上定义函数并通过名称调用该函数感到困惑,但在 PS1 中,您必须将命令放在括号中,前面加上“\$”。将函数名称括在“$(' 和 ')' 中会导致整个“$(function)”被替换为该函数的标准输出。在其前面加上反斜杠会导致您的 shell 每次想要输出 $PS1 时评估/运行该函数。如果您省略了反斜杠,则该函数只会在您第一次定义 PS1 时被调用一次,并且该函数第一次的输出从此将永远存在于您的 PS1 提示符中。
答案2
当你调用时$(one_func)
,它将执行该函数并返回输出。因此,如果你说,例如:
var=$(ls)
它会将命令的输出ls
(即当前目录中的文件列表)存储到变量中$var
。而命令:
var=ls
只会将的值设置$var
为“ls”。
顺便说一下,在 bash 中调用函数的方式与执行命令的方式相同。
答案3
只是想补充一下上面的内容,非常有用的信息...嵌套函数和调用可执行文件时也适用同样的想法...
PS1="# \e[1;30m\u\e[0;37m@\h: \e[1;31m\w\e[31m >\e[1;30m \t \e[1;33m [ \$(kmg \$(totalfilesize.sh)) ]\e[m\n"
“kmg” 是我定义的一个 bash 函数,并使用此语法从“totalfilesize.sh”脚本的输出中传递一个参数
\$(kmg \$(totalfilesize.sh))
如果您好奇,totalfilesize 会计算当前目录中文件的大小,而 kmg 会将字符串(以字节为单位)转换为人类可读的 b、mB、gB 等。