鱼为什么以及如何不支持POSIX?

Cy8*_*099 8 shell posix fish

我听说鱼是一个友好的开箱即用的外壳,但它也不支持POSIX标准.另一方面,我读到了关于POSIX标准(我也在我的Fedora上进行了测试,它是惊人的,开箱即用的shell现在我想将我的默认shell更改为fish).

但是我提出这个问题的问题是:我误解了鱼和POSIX标准之间的关系,你对鱼的意思不完全支持POSIX?& 怎么样?(我应该把我的bash变成鱼吗?).

请解释一下,因为我是一个小新手,谢谢.

tha*_*guy 13

鱼不是,从来没有尝试过与POSIX sh兼容.

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

显然,就像您无法将Java片段复制粘贴到Python程序中一样,您无法将sh代码复制粘贴到其中fish.

在实践中,这意味着当您搜索"如何在我的提示中显示当前git分支"之类的内容时,您需要确保找到fish答案,因为这些答案sh无效.同样,当书籍或说明书指示运行时,您可能偶尔需要手动重写其中一些(或打开一个bashshell并将其粘贴到那里).

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

  • @ZhengQu 人们经常将当前分支名称添加到 shell 提示符中,例如 bash 中的 `PS1='$(gitbranch --show-current) \$ '` 。如果你想在鱼身上做到这一点,你必须用不同的方式来做 (7认同)
  • 我不确定“如何在提示中显示当前的 git 分支”是一个很好的例子。在任一 shell 中,“gitbranch”就足够了。或者我错过了什么? (2认同)

Bas*_*tch 9

其实,fish不是符合POSIX的sh 定义.但两者都不是csh(可能zsh).您仍然可以将其fish用作交互式shell.

例如echo $$,在POSIX中显示shell的pid sh.但fish事实并非如此.

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

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

但是如果你编写shell脚本,那么为POSIX sh规范编写它们会使这些脚本更具可移植性.(你将使用shebang #!/bin/sh启动它们,Linux execve(2)可以理解).在某些情况下,您不关心shell脚本的可移植性,您可以将它们#!/usr/bin/fish 作为fish脚本开始.然后他们将无法在没有的系统上工作fish.

另外,系统(3) C标准库函数使用/bin/sh -c.

我非常喜欢Yann Regis- Gianas在FOSDEM2018 上对POSIX [s]地狱的谈话.

  • zsh肯定不符合它的默认运行时配置(对于不带引号的扩展,f/e,这个定义是明确的分词) - 但它比bash在名称`sh`下启动时做得更好. (3认同)