sh가 무엇인지 알아보세요 [중복]

sh가 무엇인지 알아보세요 [중복]

이식성을 원하는 스크립트 세트를 작성하고 있지만 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

관련 정보