我有一些bash函数,例如
#!/bin/sh
git-ci() {
...
}
当我不使用鱼时,我的source ~/.my_functions
中有一个~/.bash_profile
行,但是现在不起作用。
我可以对鱼使用bash函数吗?还是唯一的方法是将它们翻译成鱼,然后通过funcsave xxx
保存?
答案 0 :(得分:1)
在fish
中定义函数的语法与POSIX shell和bash
完全不同。
POSIX函数:
hi () {
echo hello
}
被翻译为:
function hi
echo hello
end
脚本语法还有其他差异。有关示例,请参见Fish - The friendly interactive shell中标题为块的部分。
因此,基本上不可能尝试使用在bash
中为fish
编写的函数,因为它们与bash
和csh
不同。您将必须检查所有函数并将其转换为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!