저는 스크립트를 작성하고 있는데 이 경우 스크립트에서 정의한 모든 변수 이름과 값의 덤프를 볼 수 있다면 정말 도움이 될 것입니다. 예는 다음과 같습니다.
foo="1"
bar="2"
print_script_variables
baz="3"
print_script_variables
그러면 다음이 출력됩니다.
foo="1"
bar="2"
foo="1"
bar="2"
baz="3"
비슷한 것이 print_script_variables
존재합니까? 실행 중인 스크립트를 구문 분석하는 것은 어리석은 일이라고 생각합니다.
이것이 존재하지 않는다면 수동으로 여러 echo
명령을 입력했을 것입니다. 문제를 해결할 때 장소를 옮기고 싶고 print_script_variables
어떤 변수가 범위에 들어오고 나가는지 걱정할 필요가 없기 때문에 이는 약간 짜증나는 일입니다.
이것은 bash 스크립트이지만 터미널에서 zsh를 사용하므로 두 가지 모두에서 작동하는 것이 이상적입니다.
답변1
muru의 답변에 추가하여 스크립트 시작 부분에 환경 변수 이름을 저장하고 print_script_variables 함수가 호출될 때 환경 변수를 필터링할 수 있습니다. POSIX 호환 메서드의 경우 set 유틸리티를 사용하여 스크립트 시작 부분에 모든 변수를 나열하고 임시 파일에 저장합니다. print_script_variables 함수를 호출할 때 diff를 사용하여 불필요한 변수를 필터링합니다.
# invoke at script start
set > /tmp/file1 # assuming /tmp/file1 is a safely generated temporary file
trap 'rm -f /tmp/file1' INT TERM HUP EXIT # delete the file on SIG{INT,TERM,HUP} and EXIT
print_script_variables() {
# suppress lines unique to file1 and lines present in pipe (set output)
# that it outputs only lines added to file1, i.e. new variables
set | comm -13 /tmp/file1 - # edited; thanks to Martin for helping to save an extra file;
}
variable=20
print_script_variables
편집하다
첫 번째 줄을 자동으로 실행하는 방법이 필요한 경우 다음을 사용할 수 있습니다.포인트(또는 소스)스크립트 시작 부분에서 이 줄을 자동으로 실행하는 유틸리티입니다. 첫 번째 줄과 함수 정의를 파일에 저장해야 합니다 print_script_variables
. 예를 들면 다음과 같습니다.
set > /tmp/file1
trap 'rm -f /tmp/file1' INT TERM HUP EXIT
print_script_variables() {
set | comm -13 /tmp/file1 -
}
아래와 같이 스크립트 시작 부분에서 해당 파일을 가져옵니다.
. print_script_variables
variable=20
print_script_variables()
답변2
이는 grep을 사용하여 상속된 변수를 필터링하는 또 다른 옵션입니다.
#!/usr/bin/env bash
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS
}
사용성명-p모든 쉘 변수를 보려면 또는환경변수 내보내기에만 관심이 있는 경우.
답변3
Adam Mlodzinski의 향상된 코드
#!/bin/sh
# Store names of inherited variables (by definition, exported)
readonly GREP_FILTERS=$(env | cut -d= -f1 | xargs printf " -e %s" )
print_script_vars() {
declare -p | grep -v -E $GREP_FILTERS | sed 's/declare -[^ ]\{1,2\} //' | grep =
}
variable=20
print_script_vars