为什么有些用户功能无法被 bash 识别?

Str*_*sky 5 command-line bash

我可以定义一个函数,如:

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. 更令人困惑的是,这个命令.似乎与“。”无关。这意味着“当前目录”。

gle*_*man 9

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 的符号链接。


Gil*_*il' 8

函数定义仅在 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,并且与.当前目录的含义无关。