我正在测试我正在向 BSD 编写的一些内容的可移植性。它可以在 Linux、FreeBSD、OpenBSD 上运行。它不适用于 NetBSD。
以下是我出于测试目的而安装的全新虚拟机。我已将问题追溯到
NetBSD$ uname -a
NetBSD NetBSD.local 9.1 NetBSD 9.1 (GENERIC) #0: Sun Oct 18 19:24:30 UTC 2020 [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC amd64
NetBSD$ cat /etc/shells
# $NetBSD: shells,v 1.3 1996/12/29 03:23:07 mrg Exp $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/sh
/bin/csh
/bin/ksh
/usr/pkg/bin/zsh
/usr/pkg/bin/bash
NetBSD$ for s in /bin/sh /bin/csh /bin/ksh /usr/pkg/bin/zsh /usr/pkg/bin/bash ; do echo $s; $s -c "echo OK" ; done
/bin/sh
/bin/csh
OK
/bin/ksh
/usr/pkg/bin/zsh
OK
/usr/pkg/bin/bash
OK
NetBSD$ su -
Password:
NetBSD# for s in /bin/sh /bin/csh /bin/ksh /usr/pkg/bin/zsh /usr/pkg/bin/bash ; do echo $s; $s -c "echo OK" ; done
/bin/sh
OK
/bin/csh
OK
/bin/ksh
OK
/usr/pkg/bin/zsh
OK
/usr/pkg/bin/bash
OK
为什么当我是非 root 用户时它们不起作用,为什么当我是 root 用户时它们却起作用sh -c "echo OK"
?ksh -c "echo OK"
其他 shell ( csh
、zsh
、bash
) 工作正常,如上所示。
答案1
由于 Kusalananda 的哈希值与我的哈希值相匹配,并且它们没有我在设置中进一步挖掘的问题。我的点文件在操作系统变体之间很常见,我在那里没有问题,但 NetBSD sh 和 ksh 的行为与我访问的其他 shell 不同,问题出在我的点文件中。
我正在定义 ENV,以便可以为交互式 shell 定义有用的函数。exit
如果 shell 不是交互式的,我会调用,我不记得为什么非 csh shell 在非交互式时不会获取任何内容。好吧,不是全部:NetBSD 的 sh 和 ksh 都是。它们不仅是我测试过的唯一具有该行为的 Bourne shell,而且也是唯一在该行为上退出 shell 的 Bourne shell exit
,其他 shell(使用 测试过-ic
)只是停止处理文件并执行传递给 的命令-c
。