我听说鱼是一种友好的,开箱即用的外壳,但它也不支持POSIX标准。 另一方面,我读到了关于POSIX标准(我也在我的Fedora上进行了测试,现在我想将我的默认shell更改为fish)。
但是我提出这个问题的问题是:我误解了鱼和POSIX标准之间的关系,你对鱼的意思不完全支持POSIX? &安培;怎么样? (我应该把我的bash变成鱼吗?)。
请解释一下,因为我是一个小新手,谢谢。
答案 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。