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
호출되면 sh
POSIX 모드에서 실행되어 모든 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.1
POSIX 모드에서 버전 프로세스 교체를 다시 활성화합니다.
따라서 현재 버전(현재 삭제된 자체 답변에서 4.2를 사용하고 있음)에서는 bash
절차적 대체가 sh
.
답변3
무엇인가요 /bin/sh
? 우리는 그것에 대해 이야기하고 있습니다유닉스 레거시여기! 일부 역사:
sh
1979년 Unix 버전 7에서 출시된 Bourne Shell입니다. 이는 Brian Kernighan과 Rob Pike의 The Unix 프로그래밍 환경(The Unix 프로그래밍 환경)으로 유명해졌습니다. 이 책은 Unix 프로그래밍 환경을 소개하는 최초의 상업적 출판물입니다.껍데기튜토리얼 형식의 프로그래밍 언어.
ksh
원래 David Korn이 작성한 Korn 쉘은 원래 Bourne Shell 소스 코드를 기반으로 하며 csh
Bourne 쉘과 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
것 입니다 .bash
sh
[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
당신은 항상 거기에 있고 기본적인 쉘이 되기를 기대할 수 있습니다 .