내 쉘 스크립트에서 "명령문: 찾을 수 없음" 오류가 발생하는 이유는 무엇입니까?

내 쉘 스크립트에서 "명령문: 찾을 수 없음" 오류가 발생하는 이유는 무엇입니까?

declare다음은 스크립트에서 이것을 사용하는 것을 보여주는 간단한 예입니다. 그러나 get 스크립트는 다음과 같습니다.

$ cat /tmp/new
#! /bin/sh
declare -i  hello
$ chmod a+rwx /tmp/new
$ /tmp/new
/tmp/new: 3: declare: not found
$ source /tmp/new
$ 

스크립트를 직접 실행하는 것은 작동하지 않지만 소싱하는 것은 왜 작동하는지 궁금합니다. 첫 번째 작업을 어떻게 작동하게 만들 수 있나요? 감사해요!

답변1

declare은 내장 함수이므로 와 함께 사용할 수 없으며 , 또는 (및 다른 쉘과 /bin/sh함께)만 사용할 수 있습니다. 구문은 쉘마다 다를 수 있습니다. 그에 따라 sheebang()을 선택해야 합니다 . 스크립트를 bash로 실행해야 하는 경우 첫 번째 줄은 다음과 같아야 합니다.bashzsh#!

#!/bin/bash

또는

#!/usr/bin/env bash

답변2

declarebash 및 zsh 확장입니다. 귀하의 시스템에서는 /bin/shbash나 zsh(아마도 ash)가 아니므로 declare사용할 수 없습니다. typeset대신 에 declare동의어이지만 typesetksh에서도 작동합니다. Ash typeset -i나 대부분의 다른 용도 에는 동등한 기능이 내장되어 있지 않습니다 . typeset실제로 정수 변수를 선언할 필요는 없습니다 . for typeset -i와 같은 일부 구문 단축키를 허용하는 것뿐입니다 .hello=2+2hello=$((2+2))

답변3

declare정의한 쉘에 없을 수도 있습니다.셰르본- #! /bin/sh.

시도 #!/bin/bash해봐.

소싱이 작동하는 이유는 이미 어설션을 지원하는 셸에 있기 때문입니다. 따라서 이를 소싱해도 새 쉘이 열리지 않습니다.사용하지 않았다모르는 사람들은 입장을 취합니다.

답변4

Bash의 다른 2개 버전을 사용해 볼 수도 있습니다 declare. 즉, typesetlocal. 그것들은 모두 -i다음 과 관련이 있습니다.정수). 내 것도 참조하세요테스트 스크립트. 추신. declare아직 구현되지 않음기계적 인조 인간(MKSH).

관련 정보