sh와 bash의 경우 왜 다른 출력을 얻습니까? 실행하는 경우 출력 bash

다음과 같은 간단한 스크립트가 있습니다.

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

내가 다음을 실행하는 경우 출력 sh file.sh:

Bash version ...
{1..99..2}

내가 다음을 실행하는 경우 출력 bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

두 가지 쿼리가 있습니다.

  1. 내가 쉘을 지정하는 shabang 라인을 작성한 경우 내가 사용 여부, 그것은 bash는 실행 안 sh file.shbash file.sh?

  2. 나는 $BASH_VERSIONsh에 의해 인식되지 않지만 for 루프의 문제점은 무엇입니까? 숫자를 인쇄하지 않는 이유는 무엇입니까?



답변

shBourne 쉘은 오래되었습니다 . 동작은 POSIX 표준에 의해 지정됩니다 . 새로운 동작을 원한다면 bashBourne Again 쉘인을 사용하면 항상 새로운 기능이 추가됩니다. 많은 시스템에서, sh그냥 bash, 그리고 bash호환성 모드에 대한 회전은 그 이름에서 실행할 때. 우분투에서 sh이다 dash, 데비안 Almquist 쉘.

중괄호 확장은 비교적 새로운 기능 이며 이전 bash에서도 사용할 수 없습니다. 에 없어야합니다 sh.

shebang 행은 스크립트를 실행 파일로 호출하는 경우에만 존중됩니다.

./myscript.sh

나는 어떤 shebang이라도 스크립트를 줄 수 있고 다음을 실행하여 파이썬에서 열 수 있습니다.

python myscript.sh

유닉스와 리눅스에 대한 다음과 같은 훌륭한 질문을보십시오 :


답변

SH는 바보입니다. 아무것도 할 수 없습니다.

가장 기본적인 명령 만 알고 있습니다. 다른 일은하지 않습니다.

{1..99}을 숫자 값으로 이해할 수 없습니다. 문자열로 이해합니다.

SH / Dash는 개발되지 않았습니다. DIRE 환경에 대한 긴급 프롬프트 (대화식 모드)입니다. 그렇지 않으면 스크립팅에 정말 좋습니다.

Bash는 SH가 할 수있는 모든 작업과 최신 사용자 정의 기능 및 강력한 기능을 수행 할 수 있으므로 권장됩니다.

# 1에 대한 답으로 #!프로그램이 직접 호출 된 경우에만 구문 분석됩니다. (에서와 같이 ./program.sh)