e2fsprogs パッケージの一部であるuuidgen
プログラムを参照してください。
this によると、libuuid
は til-linux の一部になり、e2fsprogsへの組み込みは段階的に廃止されます。ただし、新しいUbuntuシステムでは、uuidgen
が_uuid-runtime
_パッケージに含まれるようになりました。
Uuidを作成して変数に保存するには:
_uuid=$(uuidgen)
_
私のUbuntuシステムでは、英字は小文字で出力され、私のOS Xシステムでは、大文字で出力されます(コメントでこれを指摘してくれたDavidに感謝します)。
すべて大文字に切り替えるには(上記のように生成した後):
_uuid=${uuid^^}
_
すべて小文字に切り替えるには:
_uuid=${uuid,,}
_
たとえば、2つのUUIDがあり、それらを大文字小文字を無視してBashで比較する場合は、次のようにtolower()
スタイルの比較を実行できます。
_if [[ ${uuid1,,} == ${uuid2,,} ]]
_
Linuxで外部依存関係を追加せずに多様性を追加するには、次のようにします。
UUID=$(cat /proc/sys/kernel/random/uuid)
悪い習慣を広めるには、FreeBSDのLinux互換性レイヤー(linuxulator?)の下に、
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
参照:
完全を期すために... Debianにはdbus
パッケージでインストールされたUUIDジェネレーターもあります。先を見回して見逃しました。これはおそらくe2fsprogsパッケージと同じアルゴリズムですが、ダッシュは追加されないため、少しわかりやすいかもしれません。
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawityは安全性のヒントを追加します。「DBus UUIDは RFC 4122 に関連しないか、互換性がありません。さらに、 dbus-uuidgen は常に最後の4バイトとしてUnixタイムスタンプを使用します。したがって、一部の用途には適さない可能性があります。」 (ありがとう、Grawity、マンページでそれを見つけたはずです。)
他の実行可能ファイルに依存したくない場合、またはそれらを使用できない場合は、 here の純粋な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)があり、1行あたり16バイトを生成します。
head
-n [| tail -1](n> 0)は、前の出力の1行だけを抽出します。
awk
は、印刷ステートメントでコンマが出現するすべての場所で、OutputFieldSeparatorをハイフンに設定します。フィールド2から9を個別に指定することにより、ハイフンを制御し、 'od'が出力の各行の先頭に付けるインデックス/オフセットカウンターを取り除きます。
結果は8-4-4-4-12
小文字a-f0-9
のパターンになります。
993bb8d7-323d-b5ee-db78-f976a59d8284
ちょうどpythonは取り残された感じがしません:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
シェルで使用するには:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
生成できるUUIDの種類については Python Documentation UUID を参照してください。
非systemdマシンでsystemd machine-id互換ファイルを生成するには、pythonを使用して次のようにします。
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
Perlは、_e2fsprogs
_パッケージに基づくUUIDライブラリを提供します。私のDebianシステムでは、これは_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
_
apt-get install uuid
私のために働いた後、私はuuid
を実行しました
一部はここに到着し、スクリプトで使用する一意のIDを生成する簡単な方法を探しているだけです。本当のUUIDである必要はありません。
その場合、次のようにするだけで、秒まで一意のIDが生成されます。これを1秒以内に複数回実行しても、同じ結果が得られます。
MYID="U$(date +%s)"
echo $MYID
現在のシステム時刻に基づいて、次のようなIDを生成します。
U1454423662
注:Linuxを使用している場合、またはMacにCoreutilsをインストールしている場合は、次を使用してナノ秒の一意のIDを生成できます。
MYID="U$(date +%s%N)"
echo $MYID
または、pythonベースのソリューションをナノ秒まで下げたい場合は、ほぼどこでも機能するはずです。実行します。
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
このスレッドには、さまざまな例があり、本当に役に立ちました。さまざまな環境のuuid関数が必要になることがよくあります。純粋なbashの例は大好きですが、別の言語のライブラリを使用する方が便利な場合もあります。
したがって、完全を期すために、Ruby(1.9.3+)には、いくつかの便利なハッシュ関数とID関数を含むSecureRandomモジュールが組み込まれています。bashcliから、これを行うことができます。
Ruby -r securerandom -e 'puts SecureRandom.uuid'
OSSP UUIDライブラリ( http://www.ossp.org/pkg/lib/uuid/ )を確認し、インストールを検討してください。一部のプロジェクトではオプションとして提供されています(PostgreSQLなど)。 バージョン3およびバージョン5のUUIDを適切に処理します。これは、私のインストール済み(e2fsprogsなど)ライブラリが処理できる範囲を超えていました。さいわい、openSUSEのメインリポジトリの1つにあります。 Windows(Cygwinなど)またはMySQLで動作するバージョンを取得するのは失敗です。 Linux/PostgreSQL/Pythonに切り替えるときがきたようです(v3とv5のUUIDが本当に必要なので、MySQL/MariaDBへのSQLyog GUIをとても気に入っていました)。
私はPythonを使用して任意の数の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"')]))'
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`