我有 bash 函数foo
,并且bar
在我的~/.bashrc
.
函数foo
调用一个外部命令ext_command
,该命令本身将另一个命令作为其参数之一。我想bar
作为该命令传递,即我希望我的.bashrc
看起来像这样:
bar() {
...
}
foo() {
ext_command --invoke bar
}
然而,这不起作用,因为外部命令不是 shell 脚本,它不知道bar
.我该如何解决这个问题?
我想改为做
ext_command --invoke "bash -c 'bar'"
但此调用中的 Bash 不是作为交互式 shell 运行,因此它也不知道bar
。
因此,我相信解决我的问题的一种方法是强制 Bash 作为交互式 shell 运行;不幸的是我不知道该怎么做。
我认为肯定有效的另一种方法是使用
ext_command --invoke "bash -c 'source ~/.bashrc; bar'"
但由于某种原因这不起作用并且实际上只是运行
bash -c 'source ~/.bashrc; bar'
在交互式 bash 会话中给出
bash: bar: command not found
无论如何,我不喜欢这个解决方案,因为foo
无论它来自哪个文件,我都想工作。
答案1
一般情况下,你有以下几种选择:
- 将函数重写为命令,即。一个单独的脚本。常见的做法是保留一个
~/bin
目录并将其包含在您的$PATH
. - 将函数导出到环境并让其他 shell 从那里获取它。看我可以在 bash 中“导出”函数吗?
- 坚持
bar
成为可获取的功能,但从中获取它~/.bashrc
可能不是最好的解决方案。您可以将其放入自己的文件中~/bin
并从那里获取它。这会让事情变得简单。 - 如果可能的话,以其他方式将逻辑提供给函数
ext_command
中的,例如。foo
通过这里的文档。