$COLUMNS
변수의 동작을 이해할 수 없습니다 zsh
. 이것이 제가 말하는 행동의 예입니다. 스크립트는 $HOME/cols.sh
다음과 같습니다.
echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS
COLUMNS=
echo "COLUMNS=$COLUMNS"
set | grep -a COLUMNS
이 스크립트를 사용하거나 env -i zsh
실행하는지에 따라 다른 결과가 나타납니다 env -i =zsh
.
% env -i zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=0
COLUMNS=0
% env -i =zsh -flc '. ~/cols.sh'
COLUMNS=80
COLUMNS=80
COLUMNS=80
COLUMNS=80
나는 혼란스러워
- 실제로
zsh
및를 사용하면=zsh
다른 결과가 발생합니다. - 실제로 첫 번째 경우에는 설정이
COLUMNS=
설정과 동일해 보입니다COLUMNS=0
. - 실제로 두 번째 경우에는 설정이
COLUMNS=
아무런 영향을 미치지 않는 것 같습니다.
문서에서는 이러한 문제에 대해 많은 정보를 제공하지 않습니다.
COLUMNS <S>
The number of columns for this terminal session. Used for printing select lists and
for the line editor.
앞으로,
% which zsh
/usr/local/bin/zsh
% echo =zsh
/usr/local/bin/zsh
% =zsh --version
zsh 5.0.2 (x86_64-apple-darwin11.4.2)
답변1
Stéphane Chazelas가 주석에서 설명했듯이 zsh
서로 =zsh
다른 디렉토리에 두 개의 zsh 버전이 있기 때문에 서로 다른 결과를 제공합니다. for env -i zsh
는 설정되지 않은 경우 검색되므로 env
and (zsh
PATH
/usr/bin
/bin
대체 경로)을 실행하고 그 중 /usr/bin/zsh
명령을 실행하는 env -i =zsh
zsh 인스턴스를 실행합니다.env
확장하다=zsh
현재 검색 경로( 의 현재 값)에 대한 전체 경로 PATH
, 즉 /usr/local/bin/zsh
.
행동의 차이는 다음에서 비롯됩니다.9af1cd47229041fda4dc07f0ef70691a64d49908 제출,더 구체적으로패치 30533, zsh 5.0.0이 출시되기 전에 출시되었습니다. ( COLUMNS
커밋 히스토리를 검색해서 이 커밋을 찾았고, 영향이 있었음을 실험적으로 확인했습니다.)
COLUMNS
항상 현재 터미널 너비로 업데이트되는 "마법의" 변수입니다. zsh 4.x 이전 버전에서는 설정이 COLUMNS
터미널 크기를 조정하려고 시도했지만 제대로 작동하지 않았으며 zsh 5.0.0에서는 관련 코드가 제거되었습니다. 따라서 최신 버전의 zsh에서는 COLUMNS
대화형 셸의 설정이 적용되지 않습니다. 즉시 터미널 너비로 다시 업데이트됩니다. 이전 버전에서는 숫자가 아닌 값(예: 빈 문자열)을 설정하면 값이 정수여야 하므로 변수를 0으로 설정하는 것과 동일한 효과가 있었습니다.
답변2
이것이 지금 일어나고 있는 일입니다.
먼저, 아시다시피 COLUMNS는 터미널에 화면 너비를 알려주는 변수입니다. 때때로 쉘이 이를 설정하므로 이를 설정 COLUMNS=
하면 쉘이 터미널에서 감지한 실제 열 수로 값을 업데이트합니다.
둘째, 이 명령은 zsh를 실행하고 스크립트를 처리합니다.
env -i zsh -flc '. ~/cols.sh'
셋째, 이 명령은 다른 셸(이를 실행한 것과 동일한 셸이거나 $SHELL의 값이라고 생각함)을 실행한 다음 이를 거의 =zsh
무시합니다.
env -i =zsh -flc '. ~/cols.sh'
이렇게 하면 실제로 효과가 있는 것처럼 보이지만 =zsh
"빈" 환경 변수 이름을 지원하는 쉘이 없다고 생각하기 때문에 이것이 어떻게 유용한지 알 수 없습니다.
env -i =zsh env
출력은 입니다 =zsh
. 이는 이름이 로 설정되지 않은 변수가 있음을 의미합니다 zsh
.