Shell 为什么?;fish如何不支持POSIX?

Shell 为什么?;fish如何不支持POSIX?,shell,posix,fish,Shell,Posix,Fish,我听说fish是一个友好的开箱即用的外壳,但它也不支持POSIX标准。 另一方面,我读到了关于POSIX标准的书(我还在我的Fedora上测试了它,它非常棒,现在我想把默认的shell改为fish) 但我提出这个问题的原因是:我误解了fish和POSIX标准之间的关系,fish不完全支持POSIX是什么意思怎么用?(我是否应该将bash改为fish?) 请简单解释一下,因为我是个新手,谢谢。实际上,fish不符合POSIXsh。但两者都不是csh(也可能是zsh)。您仍然可以使用fish作为交互

我听说fish是一个友好的开箱即用的外壳,但它也不支持POSIX标准。 另一方面,我读到了关于POSIX标准的书(我还在我的Fedora上测试了它,它非常棒,现在我想把默认的shell改为fish)

但我提出这个问题的原因是:我误解了fish和POSIX标准之间的关系,fish不完全支持POSIX是什么意思怎么用?(我是否应该将bash改为fish?)


请简单解释一下,因为我是个新手,谢谢。

实际上,
fish
不符合POSIX
sh
。但两者都不是
csh
(也可能是
zsh
)。您仍然可以使用
fish
作为交互式shell

例如,
echo$$
在POSIX
sh
中显示shell的pid。但是对于
fish
它不会

(这就是为什么我没有切换到
fish
,并继续使用
zsh
作为我的每日交互式登录shell的原因)

您可以将交互式登录shell(使用
chsh
)更改为
fish

但是如果您编写,那么为POSIX
sh
规范编写它们会使这些脚本更具可移植性。(您将使用
#!/bin/sh
来启动它们,Linux可以理解这一点)。在某些情况下,您不关心shell脚本的细节,您可以让它们以
#开头/usr/bin/fish
将成为
fish
脚本。如果没有
fish
,它们将无法在系统上工作

另外,C标准库函数使用
/bin/sh-C


我非常喜欢FOSDEM2018上的POSIX[s]地狱。

fish没有也从未尝试与POSIX sh兼容

这实际上只是意味着它是一种独立的语言(如Java、Python或Ruby),而不是sh的实现或扩展(如Bash、Dash和Ksh)

显然,就像不能将粘贴Java代码片段复制到Python程序中一样,也不能将粘贴
sh
代码复制到
fish

实际上,这意味着当您搜索诸如“如何在提示符中显示当前git分支”之类的内容时,您需要确保找到
fish
答案,因为
sh
答案不起作用。类似地,当书籍或指令给出要运行的命令时,您可能偶尔需要手动重写其中一些命令(或者打开
bash
shell并将它们粘贴到那里)


这是否重要完全取决于你,所以一定要试一试

给出了posixshell命令语言标准。鱼的语言与书中描述的完全不同;因此,它不符合“POSIX外壳”的含义,这意味着可以在不修改的情况下运行为该语言编写的脚本。使用不兼容外壳的最大风险是,在编写可以使用兼容外壳执行的代码时,您可能会养成错误代码的习惯(这对zsh来说尤其危险,因为它看起来很像一个POSIX外壳,习惯可以很容易地转换,只会导致无法立即捕获的细微错误),而且你可能会惹恼任何需要维护脚本的同事。:)阅读文档:最相关的是“POSIX兼容”是什么意思。这可能是一种因祸得福,甚至不尝试兼容。zsh绝对不符合其默认运行时配置(对于无引号扩展,其定义在单词拆分上是明确的,f/e)--但它比bash在名为
sh
下启动时做得更好。我主要使用fish,但如果我必须复制和粘贴某些内容,我只需切换到zsh。你可以使用一个fish插件,它可以直接从fish轻松使用bash命令。我不确定“如何在提示符中显示当前git分支”是一个好例子。在任一shell中,
git分支
就足够了。还是我遗漏了什么?@ZhengQu人经常在shell提示符中添加当前的分支名称,例如bash中的
PS1='$(git branch--show current)\$'
。如果你想用鱼来做,你必须用另一种方式