2016-10-16 3 views
1

저는 zsh (oh-my-zsh)에 상당히 익숙하며 사용자 정의 테마를 작성하려고합니다. 내가 문제로 실행 다음과 같은 테스트 케이스에 예상대로zsh 함수는 한 번만 실행됩니다.

PROMPT='$RANDOM > ' 

작품을 감소, 각 명령에 대한 임의의 숫자를 생성합니다. 그러나도 여전히 source ~/.zshrc 같은 수의 후, 함수

PROMPT='$(my_random) > ' 

function my_random(){ 
    echo $RANDOM 
} 

항상 같은 수를 반환를 사용하는 경우. 터미널 창을 닫고 다시 열 때만 전체 세션에 대해 동일한 번호를 유지합니다.

단지 내가 할 때

PROMPT='$RANDOM $(my_random) > ' 

function my_random(){ 
    echo $RANDOM 
} 

내가 예상대로 두 개의 임의의 숫자 ...이 동작에 대한 설명 얻을?

btw, 신선한 아치 설치시 kde의 konsole을 사용하고 있습니다. 내가 사용 발견

편집

FWIW이는/dev/urandom을 직접 잘 작동합니다. 나는 아직도 무슨 일이 일어나고 있는지 알고 싶다.

function my_random() { 
    echo $(cat /dev/urandom | tr -dc '0-9' | head -c5) 
} 

답변

1

$() -expansion는 서브 쉘에서 발생하고, 서브 쉘에서 $RANDOM 변경은 부모에 영향을 미치지 않습니다. zshparam (1)에서 :

값은 의도적으로 반복 가능한 의사 랜덤 시퀀스를 형성합니다. RANDOM을 참조하는 하위 쉘은 RANDOM 값이 하위 쉘 호출 사이에 상위 쉘에서 참조되거나 시드되지 않는 한 동일한 의사 랜덤 값을 갖습니다.

당신은 그것을 재현하는 프롬프트를 설정하는 설정 할 필요가 없습니다 :

% echo $(echo $RANDOM) 
17454 
% echo $(echo $RANDOM) 
17454 

bash는 여기 zsh을의 행동을 공유하지 않습니다.

성가신 비트 프롬프트 확장 이 서브 쉘에서 일어나는 것을, 그래서 당신은 precmd, 말에 $RANDOM을 참조하여이 문제를 해결할 수 없습니다. 내가 찾을 수있는 가장 좋은 방법은 빈 확장에서 수행하는 것입니다.

PROMPT='${RANDOM##*}$(my_random) > ' 
+0

설명해 주셔서 감사합니다. 빈 exapnsion와 함께 좋은 속임수. 나는 그걸로 갈 것 같아. 감사! –

+0

'precmd() {: $ RANDOM; PS1 = "$ (my_random)>"; }'의도 한대로 작동해야합니다. – chepner

관련 문제