답변:
e2fsprogs 패키지의 uuidgen
일부인 프로그램을 참조하십시오 .
따르면 이 , libuuid
현재의 일부 의 util 리눅스 에서 e2fsprogs에 포함될 폐지되고있다. 그러나 새로운 우분투 시스템에서는 uuidgen
이제 uuid-runtime
패키지에 들어 있습니다.
UUID를 작성하여 변수에 저장하려면 다음을 수행하십시오.
uuid=$(uuidgen)
내 우분투 시스템에서 알파 문자는 소문자로 출력되고 OS X 시스템에서는 대문자로 출력됩니다 (댓글에서 지적한 David에게 감사드립니다).
위와 같이 생성 한 후 모든 대문자로 전환하려면 :
uuid=${uuid^^}
모든 소문자로 전환하려면 :
uuid=${uuid,,}
예를 들어 UUID가 두 개이고 대소 문자를 무시하고 Bash에서이를 비교하려는 경우 다음 tolower()
과 같이 스타일 비교를 수행 할 수 있습니다 .
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
두 줄을 모두 출력)를 나타내므로 실제로 중요하지 않습니다 . 당신을 위해 문제를 수행하고 배시 넷이 있다면, 당신은 그것을 소문자를 만들기 위해이 작업을 수행 할 수 있습니다 uuid=$(uuidgen); uuid=${uuid,,}
또는이는 대문자로 만들기 위해 : uuid=$(uuidgen); uuid=${uuid^^}
또는이 라인을 따라 뭔가는 할 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, 맨 페이지에서 그 점을 발견해야합니다.)
dbus-uuidgen
항상 유닉스 타임 스탬프를 마지막 4 바이트로 사용합니다. 따라서 일부 용도에는 적합하지 않을 수 있습니다.
다른 실행 파일에 의존하고 싶지 않거나 사용할 수없는 경우 여기에 순수한 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
T
변수가 제거 될 수 있으며, for T
루프는 변경 될 수있다 case $N in 3 | 5 | 7 | 9) printf '-';; esac
(원하는 경우 별도의 라인에서 세분화).
case
을 제거하는 데 사용하는 버전을 보여주는 github 링크의 코드에 주석을 추가했습니다 . 코드가 훨씬 깔끔해집니다. 둘 다 이어야 하고 이어야합니다 . if
for
B%15
B%16
B%255
B%256
source <(curl url)
이든 뭐든
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
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
그래서 파이썬은 빠진 느낌이 들지 않습니다.
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
python3 -c "import uuid; print(uuid.uuid4())"
python3에 사용
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
파이썬을 사용하여 임의의 수의 UUID를 대량으로 생성하는 작은 Bash 함수를 작성했습니다.
# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
local count=1
if [[ ! -z "$1" ]]; then
if [[ "$1" =~ [^0-9] ]]; then
echo "Usage: $FUNCNAME [count]" >&2
return 1
fi
count="$1"
fi
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}
소문자를 선호하면 다음을 변경하십시오.
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
에:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
OSSP UUID 라이브러리 ( http://www.ossp.org/pkg/lib/uuid/ )를보고 설치를 고려하십시오. 일부 프로젝트는이를 옵션으로 제공합니다 (예 : PostgreSQL). 그것은 설치된 3 (예 : e2fsprogs) 라이브러리가 처리 할 수 없었던 버전 3 및 버전 5 UUID를 올바르게 처리합니다 . 다행히도 openSUSE는 주요 저장소 중 하나에 있습니다. Windows (예 : Cygwin) 또는 MySQL에서 작동하는 버전을 얻는 것이 잘못되었습니다. v3 및 v5 UUID가 실제로 필요하므로 Linux / PostgreSQL / Python으로 전환해야 할 때인 것 같습니다 (그리고 SQLyog GUI를 MySQL / MariaDB로 너무 좋아했습니다).
-v3 ns:URL custom-data
시드 메커니즘을 통해 네임 스페이스를 지원하기 때문에 완벽했습니다 .
일부는 여기에 도착할 것이라고 확신하며 스크립트에서 사용할 고유 ID를 생성하는 쉬운 방법을 찾고 있으며 실제 UUID 일 필요는 없습니다.
그렇다면 다음을 수행하면 초 단위로 고유 한 ID가 생성되므로 1 초 이내에 여러 번 실행하면 여전히 동일한 결과를 얻을 수 있습니다.
MYID="U$(date +%s)"
echo $MYID
현재 시스템 시간을 기준으로 다음과 같은 ID를 생성합니다.
U1454423662
참고 : Linux를 사용하거나 Mac에 Coreutils를 설치 한 경우 다음을 사용하여 나노초에 고유 한 ID를 생성 할 수 있습니다.
MYID="U$(date +%s%N)"
echo $MYID
또는 거의 모든 곳에서 작동 해야하는 나노 기반의 파이썬 기반 솔루션을 선호하는 경우 다음을 실행하십시오.
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
에서와 같습니다 MYID="$(mktemp -u)"
. 재부팅 할 때까지 빈 임시 파일을 배치 할 여유가 있다면 다음을 삭제하십시오 -u
.MYID="$(mktemp)"
ran=`od -X -A n /dev/random | head -1 | cut -c3-38`
correlation_id=`echo ${ran} | cut -c1-8`-`echo ${ran} | cut -c10-13`-`echo ${ran} | cut -c14-17`-`echo ${ran} | cut -c19-22`-`echo ${ran} | cut -c23-26``echo ${ran} | cut -c28-35`
od -X -A n /dev/random | head -1 | cut -c3-38
당신에게주는이 아래 에코 $ X 4151540a 1f7d0bef 8a0725fb d26183a3 UUID = echo ${x} | cut -c1-8
- echo ${x} | cut -c10-13
- echo ${x} | cut -c14-17
- echo ${x} | cut -c19-22
- echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
$ UUID 4151540a-1f7d0bef-8a07-25fbd26183a3 에코
Java 10을 사용중인 경우
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
할 수있다 bash는 스크립트에 사용 하고, 하지 대화식 명령 등을 . 그것은 원래 게시물에서 매우 분명합니다.
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
있지만 uuidgen
.
uuid-runtime
명백한 이유없이 패키지에