![如何消除导入的 bash 函数中的 sh 错误?](https://linux22.com/image/155499/%E5%A6%82%E4%BD%95%E6%B6%88%E9%99%A4%E5%AF%BC%E5%85%A5%E7%9A%84%20bash%20%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%20sh%20%E9%94%99%E8%AF%AF%EF%BC%9F.png)
所以我有一个 .bash_aliases 文件,里面有许多导出的 bash 函数;其中很多与 sh 不兼容...
问题是 sh 在我通过 ssh 进入的笔记本电脑 (OS X) 和 Linux 机器上到处使用。此外,它总是尝试导入我的 bash 函数和垃圾邮件错误。
有问题的函数是:
- 我所有名称中带有“-”的函数(注意:这些只是 OS X 上的垃圾邮件错误,而不是 Linux 上的)
和一个 log() 函数(如下),其语法仅在 bash 中合法
log() { # braces allow for piping of same output to multiple files { $@ 2> >(tee .err.log); } &> >(tee .out.log); echo; echo logged output to .err.log \& .out.log respectively; } export -f log
那么我该如何解决这个问题呢?如果我不必重命名函数或将它们放在 */bin 目录中的单独脚本中,我会更喜欢它...
谢谢您的帮助!
PS截图:
编辑:我发现我没有包含足够的信息。所以是的,.bash_profile
来源.bashrc
反过来又来源.bash_aliases
(我没有.profile
)。此外,我已经尝试在 .bash_aliases 中创建退出子句,$SHELL='sh'
但它不起作用,因为它们正在被直接从我的环境导入(如@Bodo 和进口屏幕截图中的错误指示)。
编辑2 重要提示:同样奇怪的是,我刚刚发现在我 ssh 到 /bin/sh 的 linux 机器中是 bash 的符号链接。这意味着 bash 虽然采购时不抛出任何错误log() 从环境导入时实际上会抛出错误?
答案1
您不应该导出这些函数。相反,我建议.bash_aliases
为所有bash
需要它的实例提供资源。 (我猜您只需要交互式 shell 中的功能bash
。)
这里提到了类似的问题:/bin/sh:导入“some-function”的函数定义时出错,其中接受的答案建议重命名函数。
即使在您的系统上/bin/sh
链接到,您也会看到错误,因为当被称为 as时,它会尝试表现得像并遵守 POSIX,请参阅bash
bash
sh
sh
https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Invoked-with-name-sh
答案2
简单的解决方案是不采购它们。由于~/.bash_aliases
不是标准文件,因此您必须在配置文件之一中显式获取它。因此,一个简单的解决方案是找到它的源代码行(最有可能在您的 中~/.bashrc
)并从此更改它(或者无论您的系统有什么,这个来自 Ubuntu):
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
对此:
if [ -f ~/.bash_aliases ] && [ -n "$BASH_VERSION" ]; then
. ~/.bash_aliases
fi
这样,.bash_aliases
只有在运行 bash 时才会获取该文件。
澄清一下,根据您的问题和评论中的信息,我假设这里发生的情况如下:
您正在通过 ssh 连接到一台机器。
因为您是通过 sshing 进入的,所以这会启动默认的
/bin/sh
登录 shell。由于这是一个登录 shell,因此它将获取
~/.profile
.因为你的
.profile
设置是源代码~/.bashrc
(同样,不是标准的,而是通用的),所以你现在可以阅读,.bashrc
尽管你可能没有运行 bash。由于您的
.bashrc
设置为 source~/.bash_aliases
,您也会读取该文件并产生错误。
我个人不喜欢的另一个原因一些系统做出的决定使默认~/.bashrc
源~/.profile
。