bash에서 UUID를 만드는 방법은 무엇입니까? UUID 를 작성할

Java에서는 임의의 UUID 를 작성할 수 있습니다 .

UUID uuid = UUID.randomUUID();

배쉬에서 이것을하는 방법?



답변

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)은 이전 출력의 한 줄만 추출합니다.

awkprintFieldSeparator를 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