如何消除导入的 bash 函数中的 sh 错误?

如何消除导入的 bash 函数中的 sh 错误?

所以我有一个 .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,请参阅bashbashshshhttps://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 时才会获取该文件。


澄清一下,根据您的问题和评论中的信息,我假设这里发生的情况如下:

  1. 您正在通过 ssh 连接到一台机器。

  2. 因为您是通过 sshing 进入的,所以这会启动默认的/bin/sh登录 shell。

  3. 由于这是一个登录 shell,因此它将获取~/.profile.

  4. 因为你的.profile设置是源代码~/.bashrc(同样,不是标准的,而是通用的),所以你现在可以阅读,.bashrc尽管你可能没有运行 bash。

  5. 由于您的.bashrc设置为 source ~/.bash_aliases,您也会读取该文件并产生错误。

我个人不喜欢的另一个原因一些系统做出的决定使默认~/.bashrc~/.profile

相关内容