我可以定义一个函数,如:
myfunction () { ls -R "$1" ; }
进而
myfunction .
只是工作。
但如果我这样做
echo "myfunction ." | sh
echo "myfunction ." | bash
Run Code Online (Sandbox Code Playgroud)
消息是:
sh: myfunction: not found
bash: line 1: myfunction: command not found
Run Code Online (Sandbox Code Playgroud)
为什么?如果不是通过管道将其传递给 sh 或 bash,我如何调用来自字符串的函数?
我知道有这个命令source
,但我对何时应该使用source
以及何时使用sh
或使用感到困惑bash
。另外,我无法通过管道传输source
. 更令人困惑的是,这个命令.
似乎与“。”无关。这意味着“当前目录”。
eval
您可以不使用,而是可以使用export
您的函数,以便子shell 继承它:
myfunction () { ls -R "$1" ; }
export -f myfunction
Run Code Online (Sandbox Code Playgroud)
进而
echo "myfunction ." | bash
Run Code Online (Sandbox Code Playgroud)
只是工作。
echo "myfunction ." | sh
可能不会,除非您的 /bin/sh 是 bash 的符号链接。
函数定义仅在 bash 的当前实例中有效。当你写
echo "myfunction ." | bash
Run Code Online (Sandbox Code Playgroud)
你运行另一个 bash 实例。您需要在其他实例中定义该函数。
如果您有一个包含函数名称和参数的字符串(如有必要,请加引号),或者更一般地包含您要执行的某些 shell 源代码的任何字符串,请使用eval
内置函数。
my_snippet='myfunction .'
eval "$my_snippet"
Run Code Online (Sandbox Code Playgroud)
如果您在 中定义函数.bashrc
,则它们只能在交互式 shell 中使用,而不能在脚本中使用。
该.
命令(几乎)等效于source
,并且与.
当前目录的含义无关。