$COLUMNS가 env 또는 set으로 나열되지 않는 이유는 무엇입니까? (zsh에서)

$COLUMNS가 env 또는 set으로 나열되지 않는 이유는 무엇입니까? (zsh에서)

저 할 수 있어요

$ echo $COLUMNS
95

결과를 얻지만 만약 내가

env | grep COLUMNS

또는

set | grep COLUMNS

나는 아무것도 얻지 못했습니다.

(업데이트: 방금 bash에서 동작이 다르다는 것을 발견했습니다. 저는 zsh를 사용하고 있습니다.)

둘째, 열이 포함된 목록을 어떻게/어디서 ​​얻을 수 있습니까? (직접 답변하는 것은 제외합니다.)

답변1

set | grep COLUMNS"바이너리 파일(표준 입력) 일치"가 표시되어야 합니다(GNU grep 사용).무루범인은 올바르게 식별되었습니다. zsh에서는 IFS표준 문자 공백, 탭, 줄 바꿈 외에도 null 바이트도 포함되어 있습니다.

set | grep --text COLUMNSgrep이 바이너리 파일을 건너뛰는 경향을 무시하도록 실행하세요 .

run은 set많은 쉘에서 출력이 모호하기 때문에 현재 설정된 매개변수를 나열하는 이식 가능하고 신뢰할 수 있는 방법이 아닙니다(변수 값의 일부인 개행 문자와 변수를 구분하는 개행 문자를 구별할 수 없음). zsh set의 출력은 모호하지 않도록 인용되어 있지만 구문 분석하기 어렵습니다. grep거짓 긍정이 여전히 반환될 수 있습니다. zsh의 모든 매개변수를 나열하려면 배열의 키를 열거하십시오 parameters.

print -rl ${(ko)parameters}

답변2

추측해야 한다면 의심할 것이다.IFS. 또한 set나열됩니다 IFS. 나에게 IFS그것은 (공백, 가로 탭, 개행 및 nul)이었습니다.

$ printf "%s" "$IFS" | od -a
0000000  sp  ht  nl nul
0000004

\0NUL 문자( )가 있으면 grep이진수로 처리되므로 사용자에 따라 grep다음이 표시될 수 있습니다.

$ set | grep COLUMNS        
Binary file (standard input) matches

grep입력이 텍스트로 처리되도록 강제할 수 있습니다 .

-a, --text
    Process a binary file as if it were text; this is equivalent 
    to the --binary-files=text option.

그래서:

$ set | grep COLUMNS --text
COLUMNS=239

관련 정보