Bash 스크립트에서 선언되고 사용되는 모든 변수를 인쇄하는 방법이 있습니까?
예를 들어, printf "%s\n" "${FUNCNAME[@]}"
현재 실행 호출 스택에 있는 모든 셸 함수의 이름이 인쇄됩니다.
예를 들면 다음과 같습니다. 내 스크립트의 내용은 다음과 같습니다(선언된 변수가 많이 있어야 함).
#!/bin/bash
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
그런 다음 다음과 같이 기록해야 합니다.
my_name = Luis Daniel
my_age = 29
name = Luis Daniel
답변1
이러한 명령 set
또는 declare
그 자체는 모든 쉘 변수와 해당 값을 인쇄합니다(또한 함수 정의도 인쇄합니다). declare -p
함수 정의는 인쇄되지 않지만 각 변수에는 해당 유형(예: -r
읽기 전용, -a
배열 등)이 주석으로 추가됩니다. 명령 자체는 및 export
와 마찬가지로 환경 변수(내보낸 쉘 변수)를 인쇄합니다 .env
printenv
변수인지 여부사용된또는 현재 쉘 세션 내에 있지 않다는 것이 이러한 명령의 출력에서 반드시 감지되는 것은 아닙니다. 쉘에는 bash
다음과 같은 많은 변수가 있습니다.어느RANDOM
및 EUID
사용 여부에 관계없이 셸 세션 . declare
호출 시 현재 범위에서 변수를 사용하지 못할 수도 있습니다. 예를 들어 함수의 지역 변수이거나 이미 존재했거나 unset
더 이상 활성화되지 않은 하위 셸에서 선언된 경우입니다.
특정 스크립트에서 생성된 변수를 보려면 예를 들어 declare -p
스크립트 시작 부분에 출력을 저장한 다음 스크립트 끝(또는 어디에 있든)에서 동일한 명령에 대한 다른 호출과 비교해야 합니다. 현재 선언 변수를 조사하고 싶습니다).
예:
#!/bin/bash
tmpfile=$(mktemp)
declare -p >"$tmpfile"
say_hello() {
name="$1"
echo "Hello $name"
}
my_name="Luis Daniel"
my_age="29"
say_hello "$my_name"
declare -p | diff "$tmpfile" -
rm -f "$tmpfile"
실행하세요:
$ bash script.sh
Hello Luis Daniel
46c46,49
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"
> declare -- name="Luis Daniel"
함수에서 변수로 선언하면 다음이 name
생성됩니다.local
declare -p
Hello Luis Daniel
46c46,48
< declare -- _=""
---
> declare -- _="Luis Daniel"
> declare -- my_age="29"
> declare -- my_name="Luis Daniel"