답변
e2fsprogs 패키지의 uuidgen
일부인 프로그램을 참조하십시오 .
따르면 이 , libuuid
현재의 일부 의 util 리눅스 에서 e2fsprogs에 포함될 폐지되고있다. 그러나 새로운 우분투 시스템에서는 uuidgen
이제 uuid-runtime
패키지에 들어 있습니다.
UUID를 작성하여 변수에 저장하려면 다음을 수행하십시오.
uuid=$(uuidgen)
내 우분투 시스템에서 알파 문자는 소문자로 출력되고 OS X 시스템에서는 대문자로 출력됩니다 (댓글에서 지적한 David에게 감사드립니다).
위와 같이 생성 한 후 모든 대문자로 전환하려면 :
uuid=${uuid^^}
모든 소문자로 전환하려면 :
uuid=${uuid,,}
예를 들어 UUID가 두 개이고 대소 문자를 무시하고 Bash에서이를 비교하려는 경우 다음 tolower()
과 같이 스타일 비교를 수행 할 수 있습니다 .
if [[ ${uuid1,,} == ${uuid2,,} ]]
답변
외부 의존성을 추가하지 않고 다양성을 추가하려면 Linux에서 다음을 수행 할 수 있습니다.
UUID=$(cat /proc/sys/kernel/random/uuid)
Linux 호환 계층 (linuxulator?) 에서 FreeBSD의 나쁜 관행을 전파하려면 ,
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
참고 문헌 :
답변
완벽을 기하기 위해 dbus
데비안 패키지 에는 UUID 생성기가 설치되어 있습니다. 일찍 둘러보고 싶었습니다. 아마도 e2fsprogs 패키지와 동일한 알고리즘이지만 대시를 추가하지 않으므로 약간 더 깨끗할 수 있습니다.
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity는 안전 팁을 추가합니다. “DBus UUID는 RFC 4122 와 관련이 없거나 RFC 4122 와 호환되지 않습니다 . 또한 dbus-uuidgen은 항상 마지막 타임 스탬프를 마지막 4 바이트로 사용하므로 일부 용도에는 적합하지 않을 수 있습니다.” (감사합니다, Grawity, 맨 페이지에서 그 점을 발견해야합니다.)
답변
다른 실행 파일에 의존하고 싶지 않거나 사용할 수없는 경우 여기에 순수한 bash 버전이 있습니다 .
# Generate a pseudo UUID
uuid()
{
local N B T
for (( N=0; N < 16; ++N ))
do
B=$(( $RANDOM%255 ))
if (( N == 6 ))
then
printf '4%x' $(( B%15 ))
elif (( N == 8 ))
then
local C='89ab'
printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
else
printf '%02x' $B
fi
for T in 3 5 7 9
do
if (( T == N ))
then
printf '-'
break
fi
done
done
echo
}
[ "$0" == "$BASH_SOURCE" ] && uuid
답변
uuidgen을 사용할 수없는 경우이 스크립트 “한 줄짜리”가 유용하다는 것을 알았습니다. 또한 Perl 또는 Python 용 외부 모듈을 설치해야 할 필요도 없습니다.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 이상에서 성공적으로 테스트되었습니다. 이것이 독특하지 않은 경향이 있는지 궁금하지만, 지난 10 년 동안 ‘비트’되지 않았습니다. 물론 head -1
교체 할 수도 있습니다 head -_other-value_ | tail -1
.
설명하기,
/dev/random
및 /dev/urandom
임의 발전기 커널된다.
od
(8 진 덤프)에는 16 비트 출력 스위치 (-x)가있어 라인 당 16 바이트를 생성합니다.
head
-n [| tail -1] (여기서 n> 0)은 이전 출력의 한 줄만 추출합니다.
awk
printFieldSeparator를 print 문에서 쉼표가 나타나는 곳마다 하이픈으로 설정합니다. 필드 2-9를 독립적으로 지정하여 하이픈을 제어하고 각 출력 줄 앞에 ‘od’가 붙는 인덱스 / 오프셋 카운터를 제거합니다.
결과는 8-4-4-4-12
소문자 패턴입니다 a-f0-9
.
993bb8d7-323d-b5ee-db78-f976a59d8284
답변
그래서 파이썬은 빠진 느낌이 들지 않습니다.
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
쉘에서 사용하려면 :
myvar=$(python -c 'import uuid; print uuid.uuid1()')
생성 할 수있는 UUIDS 종류 는 Python 설명서 UUID 를 참조하십시오 .
비 시스템 머신에서 시스템 머신 ID 호환 파일을 생성하려면, 파이썬을 사용하여 다음과 같이 수행 할 수 있습니다.
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
답변
Perl은 e2fsprogs
패키지를 기반으로 UUID 라이브러리를 제공 합니다. 내 데비안 시스템에서는 libuuid-perl
패키지입니다. 여기 하나의 라이너가 있습니다. 자세한 내용 man uuid
을 참조하십시오 :
$ perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4
백틱이나 $()
표기법 으로 쉘 스크립트에 추가하는 것은 쉽지 않습니다 .
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff