나는 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
루트가 아닌 경우에는 왜 작동하지 않으며, 루트인 경우에는 작동하는 이유는 무엇입니까 sh -c "echo OK"
?ksh -c "echo OK"
다른 쉘( csh
, zsh
, bash
)은 위에 표시된 대로 잘 작동합니다.
답변1
Kusalananda의 해시가 내 해시와 일치하고 문제가 없었기 때문에 설정을 더 자세히 살펴보았습니다. 내 도트 파일은 운영 체제 변형 간에 공통적이며 거기에는 문제가 없습니다. 하지만 NetBSD sh와 ksh는 내가 액세스할 수 있는 다른 셸과 다르게 동작하며 문제는 내 도트 파일에 있습니다.
대화형 쉘에 유용한 기능을 정의할 수 있도록 ENV를 정의하고 있습니다. exit
쉘이 대화형이 아닌 경우 호출했는데, csh가 아닌 쉘이 대화형이 아닐 때 왜 아무 것도 얻지 못하는지 기억이 나지 않습니다. 글쎄요, 전부는 아닙니다. NetBSD의 sh와 ksh가 그렇습니다. 그것들은 내가 해당 동작으로 테스트한 유일한 Bourne 쉘일 뿐만 아니라 해당 동작에서 쉘을 종료하는 유일한 쉘이기도 합니다 exit
. 다른 쉘(로 테스트됨 -ic
)은 파일 처리를 중지하고 전달된 명령을 실행합니다 -c
.