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로 실행해야 하는 경우 첫 번째 줄은 다음과 같아야 합니다.bash
zsh
#!
#!/bin/bash
또는
#!/usr/bin/env bash
답변2
declare
bash 및 zsh 확장입니다. 귀하의 시스템에서는 /bin/sh
bash나 zsh(아마도 ash)가 아니므로 declare
사용할 수 없습니다. typeset
대신 에 declare
동의어이지만 typeset
ksh에서도 작동합니다. Ash typeset -i
나 대부분의 다른 용도 에는 동등한 기능이 내장되어 있지 않습니다 . typeset
실제로 정수 변수를 선언할 필요는 없습니다 . for typeset -i
와 같은 일부 구문 단축키를 허용하는 것뿐입니다 .hello=2+2
hello=$((2+2))
답변3
declare
정의한 쉘에 없을 수도 있습니다.셰르본- #! /bin/sh
.
시도 #!/bin/bash
해봐.
소싱이 작동하는 이유는 이미 어설션을 지원하는 셸에 있기 때문입니다. 따라서 이를 소싱해도 새 쉘이 열리지 않습니다.사용하지 않았다모르는 사람들은 입장을 취합니다.
답변4
Bash의 다른 2개 버전을 사용해 볼 수도 있습니다 declare
. 즉, typeset
및 local
. 그것들은 모두 -i
다음 과 관련이 있습니다.정수). 내 것도 참조하세요테스트 스크립트. 추신. declare
아직 구현되지 않음기계적 인조 인간(MKSH).