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


8

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

#!/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 루프의 문제점은 무엇입니까? 숫자를 인쇄하지 않는 이유는 무엇입니까?

답변:


16

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

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

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

./myscript.sh

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

python myscript.sh

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


5

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

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

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

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

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

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


6
" 이것은 DIRE 환경에 대한 긴급 프롬프트를 의미합니다. " dash, shUbuntu에서 제공하는 것처럼 " DIRE 환경에 대한 긴급 프롬프트"가 아니라 시스템이 빠르게 실행되고 시작될 수 있습니다. . 이러한 방법으로 dash도 현대 OS에서 사용하기에 적합합니다,하지만 그것을 잘 맞는 것 에 대한 것은 로우 프로파일, 스크립트 빠른 셸입니다 - 큰, 복잡한 현대 OS를 부팅하는 동안 특히, 최소로, 시스템 스크립트를 실행 성능 오버 헤드.
Eliah Kagan

@EliahKagan 정말 잘못되었을 때 SH 만 사용합니다.
Kaz Wolfe

1
당신은 sh꽤 끊임없이, 특히 우분투 부츠로 집중적으로 사용합니다. 자동화 된 스크립팅 사용에 주로 중요하며 우분투에서 매우 중요한 사용 사례입니다. (당신이한다면 제거/bin/sh 심볼릭 링크를 - 그래서, 사실상, "더 SH"없을 것이다 - 일이 정말 잘못 것 : 우분투가 사용 가능한 상태로 부팅 할 수 없습니다.)
엘리야 케이건

@EliahKagan 언제 마지막으로 SH를 선호 터미널로 사용 했습니까? 스크립트에 사용하지만 실제로 대화식 모드에서 언제 사용합니까?
Kaz Wolfe

2
어제는 명령이 얼마나 휴대 가능한지 확인했습니다. 그러나 대시의 대화식 사용이 드물다는 요점은 유효합니다. (어쨌든 내 대화식 사용의 컨텍스트는 여전히 스크립팅 중심이었습니다.) ....하지만 "사용"은 "대화식 사용"을 의미하지 않으며, 더 중요한 것은 이 질문의 사용 사례는
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.