我听说过fish,它是一个友好的开箱即用的shell,但它不支持POSIX标准。另一方面,我读到过POSIX标准(我也在我的Fedora上测试过它,它是一个令人惊讶的开箱即用的shell,现在我想把我的默认shell改为fish)。但我提出这个问题的原因是:我误解了fish和POSIX标准之间的关系,你说fish不完全支持POSIX是什么意思?怎么做?(我应该把我的bash改成fish吗?)
axzmvihb1#
fish不是也从未尝试过与POSIX sh兼容。这实际上只是意味着它是一种独立的语言(如Java、Python或Ruby),而不是sh的实现或扩展(如Bash、Dash和Ksh)。显然,就像不能将Java代码片段复制粘贴到Python程序中一样,也不能将sh代码复制粘贴到fish中。在实践中,这意味着当你搜索“如何在提示符中显示当前git分支”时,你需要确保找到fish的答案,因为sh的答案是不起作用的.同样,当书籍或说明书给予运行命令时,你可能偶尔需要手动重写其中的一些命令(或者打开bash shell并将其粘贴到那里).这是否重要完全取决于你,所以一定要给予一试。
sh
fish
bash
1sbrub3j2#
实际上,fish并不兼容POSIX shdefinition,但是csh(可能还有zsh)也不兼容,您仍然可以使用fish作为交互式shell。例如echo $$显示了POSIX sh中shell的pid,但是fish中没有。(and这就是为什么我没有切换到fish,而是继续使用zsh作为我的日常交互式登录shell)您可以将交互式登录shell(使用chsh)更改为fish。但是如果您编写shell scripts,那么为POSIX sh规范编写它们会使这些脚本更易于移植。(您将使用shebang#!/bin/sh来启动它们,Linux execve(2)可以理解它)。你不关心你的shell脚本的portability,你可以让它们从#!/usr/bin/fish开始变成fish脚本,这样它们就不能在没有fish的系统上工作了。此外,system(3) C标准库函数使用/bin/sh -c。在FOSDEM2018上,我非常喜欢 POSIX [s]hell 上的Yann Regis-Gianas' talk。
csh
zsh
echo $$
chsh
#!/bin/sh
#!/usr/bin/fish
/bin/sh -c
2条答案
按热度按时间axzmvihb1#
fish不是也从未尝试过与POSIX sh兼容。
这实际上只是意味着它是一种独立的语言(如Java、Python或Ruby),而不是sh的实现或扩展(如Bash、Dash和Ksh)。
显然,就像不能将Java代码片段复制粘贴到Python程序中一样,也不能将
sh
代码复制粘贴到fish
中。在实践中,这意味着当你搜索“如何在提示符中显示当前git分支”时,你需要确保找到
fish
的答案,因为sh
的答案是不起作用的.同样,当书籍或说明书给予运行命令时,你可能偶尔需要手动重写其中的一些命令(或者打开bash
shell并将其粘贴到那里).这是否重要完全取决于你,所以一定要给予一试。
1sbrub3j2#
实际上,
fish
并不兼容POSIXsh
definition,但是csh
(可能还有zsh
)也不兼容,您仍然可以使用fish
作为交互式shell。例如
echo $$
显示了POSIXsh
中shell的pid,但是fish
中没有。(and这就是为什么我没有切换到
fish
,而是继续使用zsh
作为我的日常交互式登录shell)您可以将交互式登录shell(使用
chsh
)更改为fish
。但是如果您编写shell scripts,那么为POSIX
sh
规范编写它们会使这些脚本更易于移植。(您将使用shebang#!/bin/sh
来启动它们,Linux execve(2)可以理解它)。你不关心你的shell脚本的portability,你可以让它们从#!/usr/bin/fish
开始变成fish
脚本,这样它们就不能在没有fish
的系统上工作了。此外,system(3) C标准库函数使用
/bin/sh -c
。在FOSDEM2018上,我非常喜欢 POSIX [s]hell 上的Yann Regis-Gianas' talk。