다른 컨텍스트에서 변수를 사용하지 않는 경우 $RANDOM
변수를 인쇄하면 동일한 결과가 나타납니다. zsh
이는 쉘에 명령 출력이나 변수 값의 캐시가 있어서 새 값을 얻을 수 없는 것과 같습니다. 나는 이것을 실행하고 있습니다 :
zsh $ printf \\$(printf "%o" $(( $RANDOM % 123)))\\$(printf "%o" $(( $RANDOM % 123)))
이는 두 번 동일한 결과 $RANDOM
이며, 다른 연속 실행에서도 여전히 첫 번째 실행과 동일한 결과를 얻습니다.
여전히 똑같은 행동을 취합니다.printf \\$(printf "%o" $(( $(echo $RANDOM) % 123)))\\$(printf "%o" $(( $(echo $RANDOM) % 123)))
답변1
의 재산입니다 zsh
. 또한 man zshparam
보십시오 RANDOM
:
RANDOM 값은 의도적으로 반복되는 의사 난수 시퀀스를 형성합니다. RANDOM을 참조하는 하위 쉘은 RANDOM 값이 하위 쉘 호출 사이에 상위 쉘에서 참조되거나 시드되지 않는 한 동일한 의사 난수 값을 생성합니다.
내부 서브셸을 평가 중이므로 $RANDOM
예상되는 결과는 다음과 같습니다.
$ RANDOM=123
$ echo $(echo $RANDOM) $(echo $RANDOM) $(echo $RANDOM)
17313 17313 17313
Bash 또는 busybox ash에서 동일한 명령:
$ echo $(echo $RANDOM) $(echo $RANDOM) $(echo $RANDOM)
12554 22752 18907
다른 껍질, 다른 행동.
다른 예 zsh
:
$ RANDOM=123
$ echo $RANDOM $(echo $RANDOM) $RANDOM $(echo $RANDOM) $RANDOM
17313 7829 7829 9329 9329
상위 쉘에서 사용될 때마다 $RANDOM
후속 하위 쉘에는 의사 무작위 순서로 다음 번호가 지정됩니다. 그러나 자식 쉘은 부모 쉘에 영향을 미치지 않으므로 $RANDOM
부모 쉘을 다시 사용할 때 숫자가 반복됩니다.
답변2
두 서브쉘 모두에서 동일한 값을 얻게 되지만 $RANDOM
여기서는 서브쉘이 필요하지 않습니다.
주어진 값(또는 산술 표현식)에 해당하는 문자를 얻으려면 #
매개변수 확장 플래그를 사용할 수 있습니다.
$ (){ printf %s ${(#)argv}; } RANDOM%123 RANDOM%123
KU
여기서 이 플래그는 익명 함수의 매개변수에 적용됩니다.
다음 을 사용하더라도 printf
서브쉘을 생성할 필요는 없습니다 .
$ printf -v var '\\%o' RANDOM%123 RANDOM%123
$ print $var
D#
멀티바이트 로케일에서는 #
매개변수 확장 플래그가 wchar_t 값에 해당하는 문자를 제공합니다. GNU 시스템에서는 이것이 유니코드 코드 포인트입니다.
$ () { print ${(#)1}; } 128039