如何在鱼上使用bash函数

时间:2019-07-10 19:06:00

标签: bash fish

我有一些bash函数,例如

#!/bin/sh

git-ci() {
    ...
}

当我不使用鱼时,我的source ~/.my_functions中有一个~/.bash_profile行,但是现在不起作用。

我可以对鱼使用bash函数吗?还是唯一的方法是将它们翻译成鱼,然后通过funcsave xxx保存?

3 个答案:

答案 0 :(得分:1)

fish中定义函数的语法与POSIX shell和bash完全不同。

POSIX函数:

hi () { 
    echo hello
}

被翻译为:

function hi
    echo hello
end

脚本语法还有其他差异。有关示例,请参见Fish - The friendly interactive shell中标题为的部分。

因此,基本上不可能尝试使用在bash中为fish编写的函数,因为它们与bashcsh不同。您将必须检查所有函数并将其转换为fish语法。

答案 1 :(得分:1)

如@Barmer所说,fish并不关心兼容性,因为其目标之一是

  

健全的脚本

     

fish是完全可编写脚本的,其语法简单,简洁且一致。您再也不会写esac。

鱼民认为bash太疯狂了,我个人同意。

您可以做的一件事是将bash函数放在单独的文件中,然后在fish中将它们称为函数。

示例:

之前

#!/bin/bash

git-ci() {
    ...
}

some_other_function() {
    ...
}

之后

#!/bin/bash
# file: git-ci

# Content of git-ci function here
#!/bin/bash
# file: some_other_function

# Content of some_other_function function here

然后将脚本文件放在路径中的某个位置。现在您可以用鱼叫它们了。

希望有帮助。

答案 2 :(得分:0)

如果您不想更改所有语法,一种解决方法是创建一个运行 bash 脚本并直接传递参数的 fish 函数。


示例

如果你有这样的功能

sayhi () { 
    echo Hello, $1!
}

你只需通过剥离函数部分来更改它,并将其保存为可执行脚本

echo Hello, $1!

然后创建一个调用该脚本的fish函数(例如名称为sayhi.fish

function sayhi 
    # run bash script and pass on all arguments
    /bin/bash absolute/path/to/bash/script $argv
end

而且,瞧,像往常一样运行它

> sayhi ivkremer
Hello, ivkremer!