Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 根据使用的shell向前移动的条件_Bash_Shell_Conditional Statements_Fish_Dotfiles - Fatal编程技术网

Bash 根据使用的shell向前移动的条件

Bash 根据使用的shell向前移动的条件,bash,shell,conditional-statements,fish,dotfiles,Bash,Shell,Conditional Statements,Fish,Dotfiles,我正在尝试编写一个.functions点文件,目的是在我的bash、zsh和fish配置文件中加载它(source$HOME/.functions)。我已经用另一个(.alias)成功地完成了。但是现在我面临一个问题,这个问题源于fish不符合posix 问题是别名在三个shell之间共享语法,但是当涉及函数时,fish有自己的语法(function my#func;#code;end,而不是function my#func{code;})。例如,考虑: 鱼: Bash/Zsh: say_hel

我正在尝试编写一个
.functions
点文件,目的是在我的bash、zsh和fish配置文件中加载它(
source$HOME/.functions
)。我已经用另一个(
.alias
)成功地完成了。但是现在我面临一个问题,这个问题源于fish不符合posix

问题是别名在三个shell之间共享语法,但是当涉及函数时,fish有自己的语法(
function my#func;#code;end
,而不是
function my#func{code;}
)。例如,考虑:

鱼:

Bash/Zsh:

say_hello() {
    echo "hello";
}
这使我无法仅将它们“按原样”写入文件中,因此我考虑编写一个条件,例如
if[“$0”=“bash”]| |[“$0”=“zsh”];然后#函数#POSIX;其他"功能"鱼;;fi
。但是,这种条件语法在fish中也不可用

那就是我被困的地方。我不希望每个shell都有单独的文件


提前谢谢。

我认为唯一可行的答案是将定义分开

即使您想办法绕过fish检查整个文件的语法这一事实(因此,无论您在哪里放置bash函数定义,它都会在不执行任何操作的情况下给出语法错误),这也不会生成一个易于编辑的可读文件。你只是在和黑客搏斗

而且函数定义无论如何都不能共享,因为它不仅仅是从
fi
end
的简单搜索和替换-语义是不同的,例如,命令替换只能在换行符上拆分,各种特殊变量(
$@
)以不同的方式工作,数组完全不同,等等


这意味着将其设置为单个文件是不可行的,也没有帮助的,因此,请改为编写函数脚本(如果它们不修改shell的环境),或者为环境发生变化的脚本编写一个包装器,或者只编写两次。

您能给我们展示一个函数,它的主体对于fish和bash是相同的吗?请将其添加到您的答案中。如果没有这样的功能,那么我看不出这是怎么可能的。您可以为每个shell使用一个文件,或者尝试在其他shell中自动解析和转换其中一个文件,或者为每个函数创建一个脚本文件,这样您就可以像普通程序一样调用它们(但在这种情况下,您的“函数”将无法再影响父shell)。Hi@Socowi,我刚刚添加了一个示例,按照你的要求。正如我所说,我宁愿不创建单独的文件。老实说,我认为一定有办法。。。也许是在寻找
.functions
文件中固定数量的行的过程中发生的事情?我在
源代码的手册页中没有看到这一点……谢谢。我在标题中为您的问题添加了一个答案:
根据所使用的shell向前移动的条件
。然而,我可能被这个标题误导了。是不是所有的函数体都是多语言的,你只想定义一次,而不是两次定义同一个函数,即使两个定义都在同一个文件中?@P.Mosey:迟早,你会在zsh和bash之间工作方式不同的代码上绊倒;你的问题不是鱼的问题。我会将shell之间语法不同的那些定义分离到单独的文件中。至于函数,只要您的函数不应该修改它们运行的shell的环境,就可以将它们编码为外部脚本(在这里您可以自由选择任何您喜欢的语言)。即使在默认配置中,也很容易编写以BASH而不是ZSH工作的代码(除非您将它们都称为“SH”)。,它们将在其中启用兼容模式)。例如,zsh默认情况下不会对变量展开运行单词拆分,因此
a=“-r-i”;grep$a foo bar
在这两个词中的含义不同。嗨@faho,谢谢你的回答。我知道我只是想找一个解决办法,结果可能会有点笨重。我真的很喜欢极简主义。我不想再有一个或多个点文件,因为我已经有太多了。脚本选项,你是对的,它是理想的,但同样,这意味着创建更多的文件。我只是想知道fish shell的人是否想到了这种不兼容并提供了解决方案(他们想到了别名,他们是兼容的)。但我现在觉得没办法了。
say_hello() {
    echo "hello";
}