在全新安装的 Ubuntu 22.10 上,我尝试了以下命令
sudo dpkg-reconfigure dash
他什么也没做
我从中学到邮政该功能已被删除。
那么,将 bash 设为系统 shell 的正确且干净的方法是什么(例如/bin/sh
)?我希望我不必亲自处理可执行文件、手册页和所有需要的内容的符号链接……
答案1
dash
我认为你知道和之间的区别bash
...尽管dash
脚本应该一般来说运行没有问题bash
...(但反之亦然),建议不要更改系统的默认 shell,因为系统脚本是为默认 shell 编写的,将来可能会出现差异/问题。
了解并遵守当前版本的FHS(文件系统层次标准),定义/bin/sh
:
sh
POSIX 兼容命令 shell如果
/bin/sh
不是 POSIX 兼容的 shell 命令本身,则它必须是指向真实 shell 命令的硬链接或符号链接。
这就是说...sudo dpkg-reconfigure dash
当选择时no,会更改这些符号链接:
$ ls -l /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz
lrwxrwxrwx 1 root root 4 Jan 20 16:10 /bin/sh -> dash
lrwxrwxrwx 1 root root 4 Jan 20 15:42 /bin/sh.distrib -> bash
lrwxrwxrwx 1 root root 9 Jan 20 16:10 /usr/share/man/man1/sh.1.gz -> dash.1.gz
到这些符号链接:
$ ls -l /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz
lrwxrwxrwx 1 root root 4 Jan 20 16:10 /bin/sh -> bash
lrwxrwxrwx 1 root root 4 Jan 20 16:10 /bin/sh.distrib -> dash
lrwxrwxrwx 1 root root 9 Jan 20 16:10 /usr/share/man/man1/sh.1.gz -> bash.1.gz
选择时反之亦然yes。
再说一遍...虽然仅仅创建符号链接会有相同的系统 shell 和man sh
行为结果,但值得注意的是sudo dpkg-reconfigure dash
,dpkg
消遣...因此存在...这将具有识别变化并相应地处理这些文件sh.distrib
的附加效果:dpkg
文件转移是一种强制 dpkg(1) 不将文件安装到其位置而是安装到转移位置的方法。当文件引起冲突时,可以通过 Debian 软件包脚本使用转移来移走文件。系统管理员还可以使用它来覆盖某些软件包的配置文件,或者在安装包含这些文件的较新版本的软件包时,当 dpkg 需要保留某些文件(未标记为“conffiles”)时
。
选择时的转移no如下:
Removing 'diversion of /bin/sh to /bin/sh.distrib by dash'
Adding 'diversion of /bin/sh to /bin/sh.distrib by bash'
Removing 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash'
Adding 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by bash'
这样做是这样的:
$ sudo dpkg-divert --package dash --remove /bin/sh
$ sudo dpkg-divert --package bash --divert /bin/sh.distrib --add /bin/sh
$ sudo dpkg-divert --package dash --remove /usr/share/man/man1/sh.1.gz
$ sudo dpkg-divert --package bash --divert /usr/share/man/man1/sh.distrib.1.gz --add /usr/share/man/man1/sh.1.gz
选择时yes如下:
Removing 'diversion of /bin/sh to /bin/sh.distrib by bash'
Adding 'diversion of /bin/sh to /bin/sh.distrib by dash'
Removing 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by bash'
Adding 'diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash'
这样做是这样的:
$ sudo dpkg-divert --package bash --remove /bin/sh
$ sudo dpkg-divert --package dash --divert /bin/sh.distrib --add /bin/sh
$ sudo dpkg-divert --package bash --remove /usr/share/man/man1/sh.1.gz
$ sudo dpkg-divert --package dash --divert /usr/share/man/man1/sh.distrib.1.gz --add /usr/share/man/man1/sh.1.gz
因此,如果您执行符号链接,然后相应地进行转移,您应该获得与运行相同的最终结果sudo dpkg-reconfigure dash
。