편집하다

편집하다

저는 스크립트를 작성하고 있는데 이 경우 스크립트에서 정의한 모든 변수 이름과 값의 덤프를 볼 수 있다면 정말 도움이 될 것입니다. 예는 다음과 같습니다.

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

관련 정보