bash 내장 명령을 set
인수 없이 호출하면 모든 정의된 함수뿐만 아니라 모든 쉘 및 환경 변수가 인쇄됩니다. 이는 출력을 사용할 수 없게 만들고 사람이 사용하기 어렵게 만듭니다 grep
.
bash 내장 set
기능이 함수가 아닌 변수만 인쇄하도록 만드는 방법은 무엇입니까?
함수가 아닌 쉘 변수만 인쇄하는 다른 명령이 있습니까?
참고: bash는 쉘 변수와 환경 변수를 구별합니다. 이봐bash에서 환경 변수와 내보낸 환경 변수의 차이점
답변1
"함수는 출력하지 않고 쉘 변수만 출력하는 다른 명령이 있나요?"
man bash의 SHELL BUILTIN COMMANDS 섹션(set 섹션)에는 "posix 모드에서는 쉘 변수만 나열됩니다."라고 나와 있습니다.
(set -o posix; set)
참고: ()
구문은 하위 쉘을 생성합니다. 분기를 좋아하지 않으면 더 자세한 버전을 사용하십시오.
set -o posix; set; set +o posix
답변2
다음은 몇 가지 해결 방법입니다.
$ comm -3 <(declare | sort) <(declare -f | sort)
분해:
declare
정의된 모든 변수(내보냈거나 내보내지 않음)와 함수를 인쇄합니다.declare -f
인쇄 기능만 있습니다.comm -3
둘 다에 공통된 모든 줄이 삭제됩니다. 효과적으로, 이는 함수를 제거하고 변수만 남게 됩니다.
내보내지 않은 변수만 인쇄:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
또 다른 해결 방법:
$ declare -p
이렇게 하면 변수만 인쇄되지만 일부 보기 흉한 속성이 포함됩니다.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
...cut을 사용하여 특성을 잘라낼 수 있습니다.
$ declare -p | cut -d " " -f 3
한 가지 단점은 IFS의 값이 표시되지 않고 해석된다는 것입니다.
비교하다:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
"
이 출력은 한 줄에만 있으므로 추가 처리에 이 출력을 사용하기가 어렵습니다. 이런 일이 발생하지 않도록 IFS-fu를 수행할 수도 있습니다.
또 다른 해결 방법은 다음을 사용하는 것입니다 compgen
.
$ compgen -v
bash 내장 기능은 compgen
완성 스크립트에 사용하기 위한 것입니다. 이를 수행하려면 compgen -v
정의된 모든 변수를 나열하십시오. 단점: 값이 아닌 변수 이름만 나열됩니다.
이러한 값을 나열하는 요령도 있습니다.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
장점: 순수한 bash 솔루션입니다. 단점: 해석으로 인해 일부 값이 엉망이 됩니다 printf
. 또한 파이프 및/또는 루프 내의 하위 쉘은 몇 가지 추가 변수를 추가합니다.
답변3
이상하게도 내장 함수에는 인수만 표시하지 않고 typeset
함수( )만 표시하는 옵션이 있습니다 . -f
다행스럽게도 typeset
(또는 set
)는 모든 함수, 함수 및 매개변수 이름에 줄바꿈이나 등호를 포함할 수 없으며 매개변수 값의 줄바꿈이 인용되기 전에 모든 매개변수를 표시합니다(표시되는 대로 \n
). 따라서 등호가 포함되지 않은 첫 번째 줄에서 멈출 수 있습니다.
set | awk -F '=' '! /^[0-9A-Z_a-z]+=/ {exit} {print $1}'
이는 매개변수 이름만 인쇄합니다. 값을 원하면 print $1
으로 변경하십시오 print $0
.
이는 환경 변수("환경 변수"는 "내보낸 매개변수"와 동의어임)뿐만 아니라 모든 매개변수 이름(여기서 매개변수와 변수는 동의어로 사용됨)을 인쇄합니다.
또한 매개변수 이름에 대한 bash의 제약 조건과 이름이 일치하지 않는 환경 변수가 없다고 가정합니다. 이러한 변수는 bash 내부에서 생성될 수 없지만 bash가 시작될 때 환경에서 상속될 수 있습니다.
env 'foo ()
{
=oops' bash
답변4
그냥 명령을 사용하십시오 env
. 기능을 인쇄하지 않습니다.