我可以在不破坏任何进程的情况下将/bin/sh
符号链接到/bin/ksh
而不是 吗?由于它们都应该符合 POSIX 标准,我是否可以合理地期望替换不会出现问题?/bin/dash
答案1
/bin/sh
在 Ubuntu 上已经使用 bash 很多年了,FWIW较新版本的 Solaris 上的 ksh93,因此大多数功能都应该可以正常工作。无论如何,像 ksh 这样的高级 shell 上的 POSIX 模式比 dash 更自由,因此一些新功能仍然可用:
~ for shell in dash bash ksh zsh; do ARGV0=sh POSIXLY_CORRECT=1 $shell -c 'echo -n $0 {a,b,c}; [[ -z $POSIXL_CORRECT ]] && echo typo'; done
sh {a,b,c}sh: 1: [[: not found
sh a b ctypo
-n sh a b c
typo
sh {a,b,c}typo
$ for shell in dash bash ksh zsh; do ARGV0=sh $shell -c 'echo -n $0 {a,b,c}; [[ -z $POSIXL_CORRECT ]] && echo typo'; done
sh {a,b,c}sh: 1: [[: not found
sh a b ctypo
sh a b ctypo
sh {a,b,c}typo
我不认为 Ubuntu 软件包中的任何脚本依赖于 dash 的缺少括号扩展。快速扫描我的脚本/usr/bin
并没有发现任何类似的东西。ksh 和 bash 的 POSIX 模式上还有其他现代功能,因此如果不使用这些 shell 实际运行脚本,很难预测。
不过,我看不出将其制作/bin/sh
成 ksh 有什么好处。