为什么&鱼怎么不支持POSIX?

时间:2018-02-11 15:16:33

标签: shell posix fish

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

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

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

2 个答案:

答案 0 :(得分:8)

鱼不是,也从不试图与POSIX sh兼容。

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

显然,就像您无法将Java代码段复制粘贴到Python程序中一样,您无法将ajg/form代码复制粘贴到sh

实际上,这意味着当您搜索“如何在我的提示中显示当前git分支”之类的内容时,您需要确保找到fish个答案,因为fish个不行。同样,当书籍或说明发出命令时,您可能偶尔需要手动重写其中一些(或打开sh shell并将其粘贴到那里)。

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

答案 1 :(得分:5)

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

例如sh显示POSIX fish中shell的pid。但是fish却没有。

(这就是为什么我没有切换到zsh并继续使用chsh作为我的每日互动登录shell)

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

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

此外,system(3) C标准库函数使用extension UIScrollView { func setPreciseContentOffset( x:CGFloat? = nil, y:CGFloat? = nil, animated:Bool,completion:@escaping ((Bool) -> Void)) { var myX:CGFloat = self.contentOffset.x var myY:CGFloat = self.contentOffset.y if let x = x { myX = x } if let y = y { myY = y } let point = CGPoint(x:myX,y:myY) if animated { // calculate duration var duration = 0.25 // min duration let destCoord = myX != self.contentOffset.x ? myX : myY let diff = fabs ( self.contentOffset.x - destCoord) duration += TimeInterval(diff) / 1000 UIView.animate(withDuration:duration, delay: 0.0, options: [.curveEaseInOut], animations: { self.bounds = CGRect(x:point.x,y:point.y,width: self.bounds.size.width,height: self.bounds.size.height) }, completion: { (finished: Bool) in completion(finished) }) } else { self.bounds = CGRect(x:point.x,y:point.y,width: self.bounds.size.width,height: self.bounds.size.height) completion(true) } } }

我在FOSDEM2018的 POSIX [s]地狱非常喜欢Yann Regis-Gianas' talk