-a를 설정한 후 bash에서 일부 간단한 기능을 가져올 수 없나요?

-a를 설정한 후 bash에서 일부 간단한 기능을 가져올 수 없나요?

/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/pricerbash같이 보고됩니다.

bash: line <n>: export: /users/avnamn/bin/pricer: cannot export

아직 allexport기능 사용그럼에도 불구하고 여전히 내보내지지만(버그라고 생각할 수 있음) 해당 환경 내에서 호출되는 후속 셸은 가져오기를 거부하므로 bash런타임에 새 호출을 시작하라는 메시지를 받게 됩니다../script.shbash

bash의 내보낸 함수 기능은 매우 위험한 기능(특히 이 기능이 있는 시스템에서 sh! bash)이므로 주의해서 사용해야 합니다.

allexport함수는 또한 매우 위험하며(특히 bash함수 내보내기도 포함)아니요대화형 셸에서 작업을 수행하고 싶습니다.

export여기에서 명시적으로 호출 하지 않고 여러 변수를 환경으로 내보내려면 다음을 수행하는 것이 좋습니다.

set -o allexport
  A=1
  B=2
  ...
set +o allexport

(그리고 해당 코드 섹션에서 함수를 선언하지 않도록 하세요).

별칭은 csh에 기능이 없는 가난한 사람을 위한 기능입니다. Korn과 같은 셸에서는 함수를 사용하여 수행할 수 없는 작업, 즉 일부 새 명령을 정의하는 대신 일부 코드 변환을 수행하려는 경우에만 유용합니다. 대부분의 경우 이를 피하는 것이 가장 좋습니다.

관련 정보