Veja o uuidgenprograma que faz parte do pacote e2fsprogs .
De acordo com isso , libuuidagora faz parte do util-linux e a inclusão no e2fsprogs está sendo eliminada. No entanto, em novos sistemas Ubuntu, uuidgenagora está no uuid-runtimepacote.
Para criar um uuid e salvá-lo em uma variável:
uuid=$(uuidgen)
No meu sistema Ubuntu, os caracteres alfa são exibidos como minúsculos e no meu sistema OS X, eles são exibidos como maiúsculas (obrigado a David por apontar isso em um comentário).
Para mudar para todas as letras maiúsculas (depois de gerá-lo como acima):
uuid=${uuid^^}
Para mudar para todas as letras minúsculas:
uuid=${uuid,,}
Se, por exemplo, você tiver dois UUIDs e quiser compará-los no Bash, ignorando o caso, você pode fazer uma tolower()comparação de estilo assim:
Apenas para completar... Há também um gerador de UUID instalado com o dbuspacote no Debian. Eu perdi olhando ao redor mais cedo. Provavelmente é o mesmo algoritmo do pacote e2fsprogs, mas não adiciona os traços, então pode ser um pouco mais limpo para você:
Grawity acrescenta uma dica de segurança: "DBus UUIDs não são relacionados ou compatíveis com RFC 4122. Além disso, dbus-uuidgen sempre usa o timestamp Unix como os últimos 4 bytes. Portanto, eles podem ser inadequados para alguns usos." (Obrigado, Grawity, eu deveria ter visto isso na página de manual.)
Se você não quer depender de outros executáveis, ou não pode usá-los, aqui está a versão pura do bash daqui :
# 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
Eu encontrei este script "one-liner" útil onde uuidgen não está disponível. Isso também ignora qualquer necessidade de instalar módulos externos para Perl ou Python.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
Testado no SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 e mais recente com sucesso. Estou curioso para saber se isso é propenso à não-singularidade, mas não fui 'bit'dez nos últimos 10 anos. Claro, head -1poderia ser substituído por head -_other-value_ | tail -1também.
Explicar,
/dev/randome /dev/urandomsão geradores aleatórios do kernel.
od(octal dump) tem um switch de saída hexadecimal (-x) produzindo 16 bytes por linha.
head-n [| tail -1] (onde n>0) extrai apenas uma linha da saída anterior.
awkdefine o OutputFieldSeparator como um hífen em todos os lugares em que uma vírgula ocorre na instrução de impressão. Ao especificar os campos de 2 a 9 independentemente, controlamos os hífens e removemos o contador de índice/deslocamento que 'od' prefixa cada linha de saída.
O resultado é um padrão de 8-4-4-4-12caracteres minúsculos a-f0-9.
Perl fornece uma biblioteca UUID baseada no e2fsprogspacote. No meu sistema Debian é o libuuid-perlpacote. Aqui está um exemplo de uma linha; veja man uuidmais:
$ 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
Isso seria trivial para adicionar a um shellscript com acentos graves ou $()notação:
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
Eu escrevi uma pequena função Bash usando Python para gerar um número arbitrário de UUIDs em massa:
# 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"')]))'
}
Se preferir letras minúsculas, altere:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
Para:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
Consulte a biblioteca OSSP UUID ( http://www.ossp.org/pkg/lib/uuid/ ) e considere instalá-la. Alguns projetos oferecem como opção (por exemplo, PostgreSQL). Ele lida adequadamente com os UUIDs da versão 3 e da versão 5 , que estavam além do que minha biblioteca instalada (por exemplo, e2fsprogs) poderia manipular. Felizmente, o openSUSE o tem em um dos principais repositórios. Conseguir uma versão para funcionar com Windows (por exemplo, Cygwin) ou MySQL tem sido um fracasso. Parece que é hora de mudar para Linux/PostgreSQL/Python (e eu adorei a GUI do SQLyog para MySQL/MariaDB) já que eu realmente preciso de UUIDs v3 e v5.
Veja o
uuidgen
programa que faz parte do pacote e2fsprogs .De acordo com isso ,
libuuid
agora faz parte do util-linux e a inclusão no e2fsprogs está sendo eliminada. No entanto, em novos sistemas Ubuntu,uuidgen
agora está nouuid-runtime
pacote.Para criar um uuid e salvá-lo em uma variável:
No meu sistema Ubuntu, os caracteres alfa são exibidos como minúsculos e no meu sistema OS X, eles são exibidos como maiúsculas (obrigado a David por apontar isso em um comentário).
Para mudar para todas as letras maiúsculas (depois de gerá-lo como acima):
Para mudar para todas as letras minúsculas:
Se, por exemplo, você tiver dois UUIDs e quiser compará-los no Bash, ignorando o caso, você pode fazer uma
tolower()
comparação de estilo assim:Para adicionar variedade sem adicionar dependências externas, no Linux você pode fazer:
Para propagar más práticas, no FreeBSD , sob a camada de compatibilidade linux (linuxulator?),
Referências:
Apenas para completar... Há também um gerador de UUID instalado com o
dbus
pacote no Debian. Eu perdi olhando ao redor mais cedo. Provavelmente é o mesmo algoritmo do pacote e2fsprogs, mas não adiciona os traços, então pode ser um pouco mais limpo para você:Grawity acrescenta uma dica de segurança: "DBus UUIDs não são relacionados ou compatíveis com RFC 4122. Além disso, dbus-uuidgen sempre usa o timestamp Unix como os últimos 4 bytes. Portanto, eles podem ser inadequados para alguns usos." (Obrigado, Grawity, eu deveria ter visto isso na página de manual.)
Se você não quer depender de outros executáveis, ou não pode usá-los, aqui está a versão pura do bash daqui :
Eu encontrei este script "one-liner" útil onde uuidgen não está disponível. Isso também ignora qualquer necessidade de instalar módulos externos para Perl ou Python.
Testado no SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 e mais recente com sucesso. Estou curioso para saber se isso é propenso à não-singularidade, mas não fui 'bit'dez nos últimos 10 anos. Claro,
head -1
poderia ser substituído porhead -_other-value_ | tail -1
também.Explicar,
/dev/random
e/dev/urandom
são geradores aleatórios do kernel.od
(octal dump) tem um switch de saída hexadecimal (-x) produzindo 16 bytes por linha.head
-n [| tail -1] (onde n>0) extrai apenas uma linha da saída anterior.awk
define o OutputFieldSeparator como um hífen em todos os lugares em que uma vírgula ocorre na instrução de impressão. Ao especificar os campos de 2 a 9 independentemente, controlamos os hífens e removemos o contador de índice/deslocamento que 'od' prefixa cada linha de saída.O resultado é um padrão de
8-4-4-4-12
caracteres minúsculosa-f0-9
.Só para que python não se sinta deixado de fora:
Para usá-lo no shell:
Consulte o UUID da documentação do Python para os tipos de UUIDS que podem ser gerados.
Para gerar um arquivo compatível com systemd machine-id em uma máquina não systemd, você pode usar python para fazer isso desta maneira:
Perl fornece uma biblioteca UUID baseada no
e2fsprogs
pacote. No meu sistema Debian é olibuuid-perl
pacote. Aqui está um exemplo de uma linha; vejaman uuid
mais:Isso seria trivial para adicionar a um shellscript com acentos graves ou
$()
notação:Funcionou para mim, então eu corri
uuid
Eu escrevi uma pequena função Bash usando Python para gerar um número arbitrário de UUIDs em massa:
Se preferir letras minúsculas, altere:
Para:
Consulte a biblioteca OSSP UUID ( http://www.ossp.org/pkg/lib/uuid/ ) e considere instalá-la. Alguns projetos oferecem como opção (por exemplo, PostgreSQL). Ele lida adequadamente com os UUIDs da versão 3 e da versão 5 , que estavam além do que minha biblioteca instalada (por exemplo, e2fsprogs) poderia manipular. Felizmente, o openSUSE o tem em um dos principais repositórios. Conseguir uma versão para funcionar com Windows (por exemplo, Cygwin) ou MySQL tem sido um fracasso. Parece que é hora de mudar para Linux/PostgreSQL/Python (e eu adorei a GUI do SQLyog para MySQL/MariaDB) já que eu realmente preciso de UUIDs v3 e v5.