プロジェクトを進めながら全く理解できないスクリプトを発見しました。このスクリプトを理解するのに役立ちますか?このスクリプトを段階的に説明してください。
スクリプト
if ! [ -f /usr/local/bin/XXX -a -f /usr/local/bin/YYY -a -f /usr/local/bin/ZZZ ]
then
if [ "`uname`" = "Linux" ]
then
UUDECODE="uudecode -o /dev/stdout"
else
UUDECODE="uudecode -p"
fi
cat $0 | awk 'printme == "1" {print} /^DATA BEGINS HERE/ {printme = "1"}' | ${UUDECODE} | (cd /usr/local/bin ; sudo tar xzf - --unlink)
sudo chmod AAAA /usr/local/bin/XXX /usr/local/bin/YYY
fi
これまでの私の理解
- このスクリプトは/usr/local/binにXXX、YYY、ZZZがあることを確認します。
- そうでない場合は、if本文を入力してください。
- 現在のオペレーティングシステムがLinuxの場合、
- でもその時はわかりませんでした。
奇妙なことに、このスクリプトを実行した後、3つの実行可能ファイルが/ usr / local / binにあります。以下のスクリプトを1行ずつ説明してください。
私が言及したことの1つは、スクリプトの最後に「data start here」で始まる読み取り不可能なデータがあることです。スクリプトはこのデータを/usr/local/binにコピーしますか?
答え1
Linuxの場合はUDEDECODEを呼び出しコマンドの1つの形式に設定しuudecode
、そうでない場合は別の形式を設定します。標準ではないので、呼び方はさまざまです。あなたが私に尋ねるなら、私はそれほど賢くはありません。
行の始まりcat $0
は本当に重要です。$0
実行中のプロセスの名前、つまり現在のスクリプトの名前。繰り返しますが、これはほとんどの場合うまくいきますが、だますかもしれません。
スクリプトの内容はawk
スクリプトにパイプされ、その後のすべてのテキストがDATA BEGINS HERE
出力にコピーされます。これはuudecode
以前に設定されたコマンドにパイプされます。uudecode
テキストを取得してバイナリを生成します(HTTPや他のプロトコルが普及する前に、uuencode
/はバイナリファイルをテキストとして渡すために使用されました)。結果は、最初に入力を変更してから解凍するuudecode
「()」のコマンドにパイプされます。そこ/usr/local/bin
にtar
。最初は--unlink
既存のファイルを削除します。
これはどこから来たのですか?