/tmp/variables.sh
다음과 같이 설정된 함수와 변수가 포함된 파일이 있습니다 .
#!/bin/bash
set -a
foo=bar
reader() { "/users/avnamn/bin/reader4" "$@" ; }
pricer() { "/users/avnamn/bin/pricer" "$@" ; }
sget() { "/users/avnamn/bin/sget17" "$@" ; }
sourced=yes
/tmp/script.sh
그리고 다음과 같은 스크립트가 있습니다:
#!/bin/bash
if [[ "$sourced" != "yes" ]]
then
source "$(dirname "$0")/variables.sh"
fi
Bash에서는 다음을 실행합니다.
$ cd "/tmp/"
$ source ./variables.sh
$ ./script.sh
쉘의 응답은 다음과 같습니다.
bash: error importing function definition for `/users/avnamn/bin/pricer'
bash: error importing function definition for `/users/avnamn/bin/sget'
pricer
가져오기를 하면 문제가 발생하는데 왜 sget
가져오기에서는 문제가 발생하지 않습니까 reader
?
답변1
set -a
(일명 set -o allexport
) 을 사용하여 bash
모두 내보내기기능변수 외에도 이후에도 선언됩니다.
오류 메시지는 표시 bash
할 수 없습니다.수입/users/avnamn/bin/pricer
가 아닌 이름의 함수입니다 pricer
.
아마도 이것을 실행하기 전에 source ./variables.sh
다음을 실행했을 것입니다(아마도 시작 파일 중 하나에서):
alias pricer=/users/avnamn/bin/pricer
따라서 source
읽을 때:
pricer() { "/users/avnamn/bin/pricer" "$@" ; }
별칭 확장을 통해 다음으로 변환됩니다.
/users/avnamn/bin/pricer() { "/users/avnamn/bin/pricer" "$@" ; }
(그런데, 자신을 재귀적으로 호출하는 함수를 생성합니다).
에서 이러한 이름을 가진 함수를 정의할 수 있지만 bash
내보낼 bash
수는 없습니다. 시도해 보면 다음 export -f /users/avnamn/bin/pricer
과 bash
같이 보고됩니다.
bash: line <n>: export: /users/avnamn/bin/pricer: cannot export
아직 allexport
기능 사용예그럼에도 불구하고 여전히 내보내지지만(버그라고 생각할 수 있음) 해당 환경 내에서 호출되는 후속 셸은 가져오기를 거부하므로 bash
런타임에 새 호출을 시작하라는 메시지를 받게 됩니다../script.sh
bash
bash의 내보낸 함수 기능은 매우 위험한 기능(특히 이 기능이 있는 시스템에서 sh
! bash
)이므로 주의해서 사용해야 합니다.
이 allexport
함수는 또한 매우 위험하며(특히 bash
함수 내보내기도 포함)아니요대화형 셸에서 작업을 수행하고 싶습니다.
export
여기에서 명시적으로 호출 하지 않고 여러 변수를 환경으로 내보내려면 다음을 수행하는 것이 좋습니다.
set -o allexport
A=1
B=2
...
set +o allexport
(그리고 해당 코드 섹션에서 함수를 선언하지 않도록 하세요).
별칭은 csh에 기능이 없는 가난한 사람을 위한 기능입니다. Korn과 같은 셸에서는 함수를 사용하여 수행할 수 없는 작업, 즉 일부 새 명령을 정의하는 대신 일부 코드 변환을 수행하려는 경우에만 유용합니다. 대부분의 경우 이를 피하는 것이 가장 좋습니다.