CentOS 7: /bin/sh가 무엇인가요? Bash처럼 보이지만 다른 것과 비슷합니다.

CentOS 7: /bin/sh가 무엇인가요? Bash처럼 보이지만 다른 것과 비슷합니다.

Centos 7 Docker 이미지를 이와 같이 실행하면

docker run -it centos:7 bash

사용 중인 항목 실행프로세스 교체문제 없습니다. 예상대로 Bash는 처음부터 프로세스 대체를 지원했습니다. 실제로는 Bash 1.4.x였습니다.

예를 들어:

while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)

하지만 내가 전환하면/bin/sh동일한 코드가 더 이상 작동하지 않습니다.

/bin/sh
while IFS= read -r test; do echo $test; done < <(cat anaconda-post.log)
sh: syntax error near unexpected token `<'

하지만/bin/sh배쉬인 것 같아

/bin/sh --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

그런데 프로세스 대체가 더 이상 작동하지 않는 이유는 무엇입니까? 그러나 POSIX가 아닌 다른 기능도 작동하는 것으로 보입니다.

echo ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin

답변1

예, bash호출되면 shPOSIX 모드에서 실행되어 모든 bash 전용 기능이 비활성화됩니다. 매뉴얼에서 -이름 sh로 전화

Bash가 sh 이름으로 호출되면 POSIX 표준을 준수하면서 sh의 이전 버전의 시작 동작을 최대한 가깝게 모방하려고 시도합니다.

$ ls -lrth /bin/sh
lrwxrwxrwx. 1 root root 4 Aug 26  2018 /bin/sh -> bash
$ /bin/bash -c 'set -o | grep posix'
posix           off
$ /bin/sh -c 'set -o | grep posix'
posix           on

모드가 활성화 되면 posix프로세스 교체와 같은 비표준 기능이 활성화되지 않습니다. 바라보다배시 POSIX 모드이 모드에서 실행되는 전체 동작을 확인하세요.

쉘 버전 5.1부터 POSIX 모드에서 프로세스 대체가 가능합니다.

답변2

Bash의 POSIX 모드에서는 일부 옵션이 비활성화됩니다. bash로 호출 하면 활성화됩니다 sh. Bash 매뉴얼 페이지에서:

sh로 호출되면 bash는 시작 파일을 읽은 후 posix 모드로 들어갑니다.

하지만5.1POSIX 모드에서 버전 프로세스 교체를 다시 활성화합니다.

따라서 현재 버전(현재 삭제된 자체 답변에서 4.2를 사용하고 있음)에서는 bash절차적 대체가 sh.

답변3

무엇인가요 /bin/sh? 우리는 그것에 대해 이야기하고 있습니다유닉스 레거시여기! 일부 역사:

sh1979년 Unix 버전 7에서 출시된 Bourne Shell입니다. 이는 Brian Kernighan과 Rob Pike의 The Unix 프로그래밍 환경(The Unix 프로그래밍 환경)으로 유명해졌습니다. 이 책은 Unix 프로그래밍 환경을 소개하는 최초의 상업적 출판물입니다.껍데기튜토리얼 형식의 프로그래밍 언어.

ksh원래 David Korn이 작성한 Korn 쉘은 원래 Bourne Shell 소스 코드를 기반으로 하며 cshBourne 쉘과 C 쉘 사이의 중간 경로입니다. 구문은 대부분 Bourne 쉘에서 가져온 반면 작업 제어 기능은 C 쉘과 유사합니다. 원래 Korn 쉘의 기능은 POSIX 쉘 표준의 기초로 사용되었습니다.

bash"Bourne Again SHell" 입니다. Bash 구문은 Bourne 쉘 구문의 상위 집합입니다. Bash 구문에는 명령줄 편집, 명령 history, 디렉터리 스택, $RANDOM 및 $PPID 변수, POSIX 명령 대체 구문 $(...) 등 Korn 셸 및 C 셸에서 가져온 아이디어가 포함되어 있습니다.

dash"Debian Almquist 쉘"입니다. 최우선 순위는 POSIX 호환성입니다.

Bash 또는 Dash를 사용하는 하드 링크는 sh동작을 POSIX 표준으로 제한합니다.

답변4

또 다른 요점은 Centos 7에 대한 별도의 바이너리가 없다는 sh것 입니다 .bashsh

[root@work ~]# ls -la `which sh`
lrwxrwxrwx. 1 root root 4 Jun 16  2020 /usr/bin/sh -> bash
[root@work ~]# ls -la /bin/sh
lrwxrwxrwx. 1 root root 4 Jun 16  2020 /bin/sh -> bash

[root@work ~]# rpm -qf /usr/bin/sh /bin/sh
bash-4.2.46-34.el7.x86_64

bash, dash그리고 busybox아마도 다른 쉘은 시작된 명령줄을 확인할 수 있으며 일반 쉘과 같은 다른 쉘인 것처럼 가장할 것입니다( sh그렇게 호출된 경우). 이 심볼릭 링크는 이를 가능하게 합니다.

/bin/sh당신은 항상 거기에 있고 기본적인 쉘이 되기를 기대할 수 있습니다 .

관련 정보