sh가 bash에 대한 심볼릭 링크라는 것을 알았습니다.
lrwxrwxrwx 1 root root 4 May 9 15:23 /bin/sh -> bash
이유를 찾으려고 노력했고 그러다가 발견했어요bash는 sh의 구현입니다.sh 또는 POSIX처럼 동작할 수 있습니다. 따라서 #!/bin/sh가 포함된 스크립트는 bash에 의해 호출되어 sh의 동작을 모방하려고 시도합니다. dash, csh 등과 같은 다른 구현이 있습니다. 읽는 동안이 답변/bin/sh로 호출하면 bash는 시작 파일을 읽은 후 POSIX 모드로 전환합니다. 나는 쉘에 대한 경험이 많지 않지만 이 답변에서 알 수 있듯이 일부 시스템에는 기본적으로 sh가 없으며 bash 또는 다른 쉘이 sh에 대한 작업을 수행합니다. 이 문제에 대해 전문가의 의견을 듣고 싶습니다.
- sh로 호출하면 Bash는 시작 파일을 읽은 후 POSIX 모드로 들어갑니다. 그런데 이 시작 파일은 무엇입니까?
- 따라서 요점은 bash가 내 시스템에서 sh의 작업을 수행한다면 내 시스템에 sh가 없고 sh가 있는 모든 스크립트가 bash 또는 sh가 가리키는 다른 쉘에 의해 호출된다는 의미라는 것입니다.
답변1
sh로 호출하면 Bash는 시작 파일을 읽은 후 POSIX 모드로 들어갑니다. 그런데 이 시작 파일은 무엇입니까?
시작 파일은 시작 여부에 따라 달라집니다 sh
.
일반 모드에서는 대화형 쉘로 로그인 쉘이면 첫 번째입니다. //
/etc/profile
로그인 쉘이 아니면 그냥 그렇습니다.~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
모드
sh
: 로그인 쉘인 경우,/etc/profile
대화 형인 경우 환경 변수가 가리키는 모든 것. 특히, 모드 에서는 파일을 읽지 않습니다 .~/.profile
$ENV
~/.bash*
sh
구체적인 세부 사항은 매뉴얼을 참조하십시오. 이는 사소한 일이 아닙니다.6.2 Bash 시작 파일
따라서 요점은 bash가 내 시스템에서 sh의 작업을 수행한다면 내 시스템에 sh가 없고 sh가 있는 모든 스크립트가 bash 또는 sh가 가리키는 다른 쉘에 의해 호출된다는 의미라는 것입니다.
문제가 무엇인지, Bash가 sh 작업을 수행하는 동안 다른 쉘이 무엇인지 잘 모르겠습니다. 그러나 이에 관계없이 Bash의 다른 복사본을 /bin/sh
가리키면 hashbang을 사용하는 모든 스크립트 와 C에서 라이브러리 호출로 시작하는 명령은 Bash를 사용하여 실행됩니다. 하지만 Bash는 이러한 용도와 완벽하게 호환되기 때문에 그것은 중요하지 않습니다./bin/bash
#!/bin/sh
system()
또한 csh
다른 제품군에 속하며 POSIX sh와 호환되지 않습니다.
답변2
원래 Unix 시스템에는 sh
특정 동작을 수행하는 특정 프로그램이 있었습니다. .csh
ksh
그러나 POSIX는 POSIX 동작을 표준화하고 sh
최신 오픈 소스 운영 체제에서는 sh
실제로 다른 구현인 경우가 많으며 POSIX 동작을 제공하는 모드만 있습니다. 예를 들어, FreeBSD에서는 ash
; sh
OpenBSD에서는 동일한 프로그램이며, Linux에서는 종종 sh
or 를 찾을 수 있습니다 (데비안에서는 , , 등을 포함한 많은 다른 것을 허용 하지만 ) .ksh
bash
dash
sh
zsh
mksh
posh
이 경우 시스템에 독립 실행형 프로그램이 없기 때문에 호출되는 쉘이 sh
필요한 작업을 수행한다는 것은 사실입니다 . POSIX 동작을 제공하는 모드일 뿐입니다.sh
sh
이 POSIX 모드에서 이 환경 변수가 없으면 읽은 시작 파일은 로그인 셸 /etc/profile
과 $HOME/.profile
대화형 셸이 가리키는 파일 내용의 합계입니다. $ENV
쉘 특정 파일은 호출되지 않습니다.