한 쪽이 다른 쪽을 가리켜도 / bin / sh가 / bin / bash와 다르게 동작하는 이유는 무엇입니까?
이 질문에 대한 답을 조사하면서 쉘에서 놀면서 시스템에서 /bin/sh가리키고 있지만 /bin/bash두 명령이 다르게 작동 한다는 것을 알았습니다 . 우선, 출력
ls -lh /bin/sh
is :
lrwxrwxrwx 1 root root 4 Apr 22 2013 /bin/sh -> bash*
그러나을 통해 다음 명령을 호출합니다 /bin/sh.
/bin/sh -c "script.sh 2> >( grep -v FILTER 2>&1 )"
다음 오류를 반환합니다.
/bin/sh: -c: line 0: syntax error near unexpected token '>'
/bin/sh: -c: line 0: 'script.sh 2> >( grep -v FILTER 2>&1 )'
다음을 통해 동일한 명령을 실행하는 동안 /bin/bash:
/bin/bash -c "script.sh 2> >( grep -v FILTER 2>&1 )"
성공적으로 실행됩니다. 출력은 다음과 같습니다.
This should be on stderr
참고로 다음 내용은 script.sh다음 과 같습니다.
#!/bin/sh
echo "FILTER: This should be filtered out" 1>&2
echo "This should be on stderr" 1>&2
echo "FILTER: This should be filtered out" 1>&2
두 호출이 다르게 작동하는 이유는 무엇입니까?
bash$argv[0](bash는 C에서 구현 됨) 의 값을보고 호출 방법을 결정합니다.
Bash가 이름으로 호출 되면 POSIX 표준도 준수하면서
sh과거 버전의 시작 동작을sh가능한 한 가깝게 모방하려고합니다 .대화 형 로그인 셸 또는
-login옵션 이있는 비대화 형 셸로 호출되면 먼저/etc/profile및~/.profile에서 해당 순서로 명령을 읽고 실행하려고 시도합니다 . 이--noprofile옵션을 사용하여이 동작을 억제 할 수 있습니다. 이름이sh인 대화 형 셸로 호출되면 Bash는 변수를 찾고ENV정의 된 경우 해당 값을 확장하고 확장 된 값을 읽고 실행할 파일의 이름으로 사용합니다. as로 호출 된 쉘sh은 다른 시작 파일에서 명령을 읽고 실행하지 않으므로이--rcfile옵션은 효과가 없습니다. 이름으로 호출 된 비 대화식 쉘sh은 다른 시작 파일을 읽으려고 시도하지 않습니다.로 호출
sh되면 Bash는 시작 파일을 읽은 후 POSIX 모드로 들어갑니다.
bashPOSIX 모드에서 변경되는 항목의 긴 목록 (현재 46 개 항목)이 여기 에 설명되어 있습니다 .
(POSIX 모드는 비쉘로의 이식성을 위해 스크립트를 테스트하는 방법으로 주로 유용 할 것입니다 bash.)
덧붙여서, 호출 된 이름에 따라 동작을 변경하는 프로그램은 매우 일반적입니다. 일부 버전 grep, fgrep그리고 egrep(GNU는 비록 단일 실행으로 구현 grep이 작업을 수행하지 않습니다). view일반적으로 vi또는에 대한 심볼릭 링크입니다 vim. view읽기 전용 모드로 열리도록 호출 합니다. 비지 박스의 시스템은 마스터에 대한 모든 심볼릭 링크 개별 명령의 다수 포함되어 busybox실행.
bash를 호출하면 일반적으로 읽을 시작 파일을 읽은 후 posix 모드sh 로 들어가게 됩니다 (POSIX sh가 읽는 시작 파일과는 반대로). Bash에는 여러 가지 호출 모드가 있습니다. 매뉴얼 섹션 에서 이러한 모드에 대해 알아볼 수 있습니다 . 다음은 POSIX 모드에 대한 세부 정보입니다.INVOCATION
POSIX 모드
이 모드는 bash가 POSIX 기대치를 준수하기 위해 다양한 수준에서 시도 할 것임을 의미합니다. 여기 에 설명 된대로 bash는이 모드에 대해 약간 다른 의미와 함께 몇 가지 다른 호출을 가지고 있습니다.
sh: Bash는 시작 파일을 읽은 후 POSIX 모드로 들어갑니다.bash --posix: Bash는 시작 파일을 읽기 전에 POSIX 모드로 들어갑니다 .set -o posix: Bash는 POSIX 모드로 전환됩니다.POSIXLY_CORRECT: bash가 시작될 때이 변수가 환경에 있으면 쉘 은 시작 파일을 읽기 전에 posix 모드로 들어갑니다bash --posix. bash가 실행되는 동안 설정되면set -o posix.
로부터 배쉬 참조 설명서 :
Bash가 sh라는 이름으로 호출되면 POSIX 표준을 준수하면서 sh의 히스토리 버전의 시작 동작을 가능한 한 가깝게 모방하려고합니다.
때문에 bash그것을 (를 통해 호출 방법 진 검사 argv[0])하고로 실행되고있어 경우 호환성 모드로 들어갑니다 sh.
'Program Club' 카테고리의 다른 글
| Git 상태 무시 줄 끝 / 동일한 파일 / Windows 및 Linux 환경 / Dropbox / mled (0) | 2020.11.20 |
|---|---|
| Haskell의 <|> 연산자는 무엇을합니까? (0) | 2020.11.20 |
| SyncRoot 패턴의 용도는 무엇입니까? (0) | 2020.11.20 |
| SQL에서 max (count (*))를 할 수 있습니까? (0) | 2020.11.20 |
| C 문자열에서 '\ 0'뒤의 메모리는 어떻게됩니까? (0) | 2020.11.20 |