이식성을 원하는 스크립트 세트를 작성하고 있지만 sh
현재 플랫폼에서 이 스크립트가 를 나타내는지 bash
또는 ksh
를 나타내는지 알아야 합니다 ash
. 이를 수행하는 명확한 방법이 있습니까?
내 첫 번째 생각은 어떤 쉘에 어떤 것이 있는지 확인하는 것이 었습니다 --version
.
$ zsh --version
zsh 5.0.2 (x86_64-apple-darwin13.0)
$ bash --version
GNU bash, version 4.3.39(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
$ dash --version
dash: 0: Illegal option --
$ pdksh --version
pdksh: pdksh: --: unknown option
서투른 것 외에도 모든 경우에 결과가 나오지는 않습니다.
편집하다
나한테는 그게 필요해bashrc/zshrc/... 현재 작업 중인 쉘을 변수에 할당하고 해당 변수를 어디에서나 사용하는 비슷한 프로젝트입니다.
전반적인 작업의 깔끔함을 달성하려면 문제를 수정해야 하기 때문에 코드를 게시할 수 없습니다. 또한 이것은 원숭이 코드가 너무 많을 것입니다. 오해하지 마세요. 하지만 POSIX 호환성이 너무 좁아서 프로젝트를 충분히 작게 만들 수 없습니다. 그렇지 않으면 시스템 구성에 의존해야 합니다.
그러나 UNIX 쉘 정의 함수를 게시할 수는 있습니다.
PROJ_GET_SHELL () {
local PROJ_SHELL="`ps -p $$ | tail -1 | tr ' ' '\n' | tail -1`"
PROJ_local=(pdksh bash dash mksh zsh ksh sh)
for i in ${PROJ_local[*]}
do
if ! [ -z `echo $PROJ_SHELL | grep $i` ]
then
echo "$i"
break
fi
done
}
추신. 최소한의 연구에 따르면 쉘을 하위 프로세스로 실행할 때 $SHELL이 변경되지 않는 것으로 나타났습니다.
답변1
인기 있는 배포판:
$ which sh
/bin/sh
$ readlink -f /bin/sh
/bin/dash
또는 더 간결하게:
$ readlink -f $(which sh)
/bin/dash
그러나 일부(특히 임베디드 시스템 또는 initrd 빌드)에는 /bin/sh에 직접 컴파일된 쉘이 있거나 하드 링크되어 있습니다(busybox).
또 다른 특이한 예는 Windows입니다. 이 경우 git bash:
$ readlink -f $(which sh)
/usr/bin/sh