두 개의 bash 스크립트가 있다고 가정해 보겠습니다.
공급자.sh, 일부 프로세스를 수행하고 "노출"되어야 MAP
하지만 A
다음 중 하나도 수행하지 않아야 합니다 B
.
#!/bin/bash
declare -A MAP
A=hello
B=world
MAP[hello]=world
소비자.sh, 실행되고 Provider.sh
의 사용이 필요합니다 MAP
.
#!/bin/bash
source ./Provider.sh
echo ${MAP[hello]} # >>> world
환경을 최대한 정리하기 위해 Provider.sh
가시성을 최대한 낮추고 싶었습니다 Consumer.sh
. MAP만 "소스"로 만들려면 어떻게 해야 합니까?
답변1
함수를 사용하여 변수의 범위를 결정할 수 있습니다. 예:
## Provider.sh
# Global vars
declare -A map
# Wrap the rest of Provider.sh in a function
provider() {
# Local vars only available in this function
declare a=hello b=world c d
# Global vars are available
map[hello]=world
}
provider "$@" # Execute function, pass on any positional parameters
# Remove function
unset -f provider
$ cat Consumer.sh
. ./Provider.sh
echo "${map[hello]}"
echo "$a"
$ bash -x Consumer.sh
+ . ./Provider.sh
++ declare -A map
++ provider
++ declare a=hello b=world c d
++ map[hello]=world
++ unset -f provider
+ echo world
world
+ echo ''
답변2
함수를 사용하고 변수를 로컬 또는 전역으로 만들 수 있습니다.
#!/bin/bash
foo() {
declare -gA MAP # make global
local A=hello # make local
local B=world # make local
MAP[hello]=world
}
foo
그 다음에:
#!/bin/bash
source ./Provider.sh
[[ -z "$A" ]] && echo "Variable A not defined"
[[ -z "$B" ]] && echo "Variable B not defined"
echo ${MAP[hello]}
산출:
Variable A not defined
Variable B not defined
world
답변3
나는 쉘 스크립트의 일부만 얻을 수 있는 방법이 없다고 생각합니다. 모든 것을 얻거나 아무것도 얻지 않도록 선택할 수 있습니다.
그러나 grep
파일에서 원하는 줄만 추출하여 새 파일에 쓴 다음 해당 새 파일을 가져올 수 있습니다. 물론, 코드에 복잡한 기능이 있으면 이 방법은 작동하지 않습니다.
어쨌든 이 코드를 여러 스크립트로 분할하여 필요한 것만 얻는 것이 더 좋습니다. 하나의 스크립트만 사용하려는 경우 코드를 여러 함수에 넣고 여러 위치에서 코드를 가져와서 필요한 함수만 호출할 수도 있습니다.
답변4
두 개의 파일이 있다고 가정하면 source
명령줄에 두 명령을 모두 제공하고 공급자가 소비자가 나중에 사용할 수 있도록 변수를 설정하기를 원한다고 가정합니다. (아, 소비자가 생산자를 소스로 삼는다는 것을 알았습니다. 따라서 그들은 동일한 네임스페이스를 공유하고 소비자는 호출하는 네임스페이스를 오염시키지 않을 것입니다.
일부 bash_aliases 및 .bashrc
.
작동하기 위해 가져와야 하는 bash 파일이 있으면 그 파일에 알림을 추가합니다 shebang
.
#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-
/bin/bash 가 /bin/echo
아닌 /bin/bash가 사용되므로 실행 시 첫 번째 줄만 표시됩니다.
${BASH_SOURCE}
사용자에게 파일 위치를 묻는 메시지 도 표시됩니다.
두 번째 줄은 # -*-mode:sh;sh-shell:bash;fill-column:84-*-
Emacs에게 파일을 편집하는 동안 파일을 강조 표시하고 들여쓰기하는 방법을 알아내라고 지시합니다.
guest가 제공하는 두 가지 기능은 훌륭하지만, 별도의 파일에 넣어두면 그냥 파일을 실행하면 이 기능이 활성화되지 않습니다.
그래서 여기에 방문자의 코드를 가져왔지만 여러분이 원할 것이라고 생각되는 것을 달성하기 위해 약간 변경했습니다. 또한, 얻고자 하는 파일에 넣어두는 것이 조건입니다.
#!/bin/echo "You have to source this file (${BASH_SOURCE}), not run it"
# -*-mode:sh;sh-shell:bash;fill-column:84-*-
# define producer and consumer functions
declare -A MAP # you might want to use a different name
# because this is going to be in your global namespace
function provider() {
local A=hello
local B=world
MAP[hello]=world
}
## However maybe what you are wanting is a setter function instead?
function providerSetter() {
MAP[${1}] = ${2}
}
function consumer()
echo ${MAP[hello]}
}
## Again, you might want a getter function
function consumerGetter()
echo ${MAP[${1}]}
}
## you can put defaults into the second functions, i.e.,
function providerSetter2() {
MAP[${1:-hello}] = ${2:-world}
}
function consumerGetter2()
echo ${MAP[${1:-hello}]}
}
포럼에 오신 것을 환영합니다!