我曾經能夠/dev/urandom使用以下行生成隨機字符序列:
cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9-_!@#$%^&*()_ {}|:<>?=' | fold -w 100 | head -n 1 | grep -i '[!@#$%^&*()_ {}|:<>?=]' | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
但這在我升級到蒙特雷后不再起作用。我收到的輸出無非是Input error. 這個作業系統版本有什么變化嗎?我現在如何從 生成 100 個隨機字符的序列/dev/urandom?
uj5u.com熱心網友回復:
您的命令在具有語言環境的macOS Big Sur (11.6)上對我不起作用UTF8:
$ sw_vers
ProductName: macOS
ProductVersion: 11.6.2
BuildVersion: 20G314
$ locale
LANG=""
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
$ cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9-_!@#$%^&*()_ {}|:<>?=' | fold -w 100 | head -n 1 | grep -i '[!@#$%^&*()_ {}|:<>?=]' | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
tr: Illegal byte sequence
$
嘗試使用LC_ALL=C代替LC_CTYPE=C:
$ cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9-_!@#$%^&*()_ {}|:<>?=' | fold -w 100 | head -n 1 | grep -i '[!@#$%^&*()_ {}|:<>?=]' | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'
TU?S xn4>-|C-SZgBIU2Rm92Tj4Ijq5>V6Oe_:Je{%S9D{7zvey7LnSL7{j%xhDxz%JvAiUu}-aE-M:kk&jjpFtZ*3@#5@)<>>i_
$
而這個呢?
$ LC_ALL=C tr -cd '[:alnum:][:punct:]' < /dev/urandom | head -c100; echo
<NhlGfe}]\ggDPiY&Cq_3=i=k}6~_j2seQ_wnF<n`l8eF~6c( 2z0f4V4oW%5'mQv*3*gaS8eaN)5W{YxZ73O`e88=!kAyOI!ks5
$ LC_ALL=C tr -cd '[:alnum:][:punct:]' < /dev/urandom | head -c100; echo
t\gLx;|J~>=P,8wQboiK2e*5dMhN%nBhP5)>a]<9Mt&J6^&2Av1O>rs{fm@\J J9#H9f2*6UgUK]1J624vRu^#7\gVR jL=r"2&6
$
uj5u.com熱心網友回復:
在 Monterey,locale顯示LANG為已設定,而總覆寫值未LC_ALL設定,因為它通常在其他地方設定,例如https://docs.oracle.com/cd/E19455-01/806-0169/utf8-98/index。 html
要在 Monterey 中進行這項作業,只需將語言或覆寫更改為 POSIX 標準默認值:
LANG=C
或者
LC_ALL=C
在 Monterey 中,字符型別區域設定可以設定為:
LC_CTYPE=en.US.UTF-8
以避免在現在設定 LANG 的情況下偷偷通過的尖括號括起來的轉義碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402107.html
