我可以定义一个函数,如:
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,并且与.当前目录的含义无关。
| 归档时间: |
|
| 查看次数: |
10780 次 |
| 最近记录: |