https://youtu.be/kyEAws5_vnA
アニメ『アトム ザ・ビギニング』
さすが一話目から面白かったです。これがあの鉄腕アトムになるのか、ふむふむ、と視聴していました。
パンチが凄いことになっていますが、もう原子力使っているのでしょうか。
試作であってもバージョンはつけるべきかと思いますが、前回 –versionでバージョンが表示されなかったコマンドについて詳しく見ていこうかと思います。
FALSEのコマンドを上から見ていきます。
takk@deb8:~/tmp$ head list bash TRUE GNU bash, バージョン 4.3.30(1)-release (x86_64-pc-linux-gnu) bunzip2 TRUE bzip2, a block-sorting file compressor. Version 1.0.6, 6-Sept-2010. busybox FALSE bzcat TRUE bzip2, a block-sorting file compressor. Version 1.0.6, 6-Sept-2010. bzcmp FALSE bzdiff FALSE bzegrep FALSE bzexe FALSE bzfgrep FALSE bzgrep FALSE
まずは上のlistの3行目にあるbusybox。本当に–versionが失敗するか確認してみましょう。
takk@deb8:~/tmp$ busybox --version;echo $? --version: applet not found 1
appletと解釈されているようです。
busyboxのように必ず引数が必要なコマンドの場合は、引数なしでバージョンや使い方が表示されるようになっている場合があります。
引数なしで実行してみます。
takk@deb8:~/tmp$ busybox BusyBox v1.22.1 (Debian 1:1.22.0-9+deb8u1) multi-call binary. BusyBox is copyrighted by many authors between 1998-2012. Licensed under GPLv2. See source distribution for detailed copyright notices. Usage: busybox [function [arguments]...] or: busybox --list[-full] or: busybox --install [-s] [DIR] or: function [arguments]... BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as. Currently defined functions: [, [[, acpid, adjtimex, ar, arp, arping, ash, awk, basename, blockdev, brctl, bunzip2, bzcat, bzip2, cal, cat, chgrp, chmod, chown, chroot, chvt, clear, cmp, cp, cpio, cttyhack, cut, date, dc, dd, deallocvt, depmod, devmem, df, diff, dirname, dmesg, dnsdomainname, dos2unix, du, dumpkmap, dumpleases, echo, egrep, env, expand, expr, false, fgrep, find, fold, free, freeramdisk, fstrim, ftpget, ftpput, getopt, getty, grep, groups, gunzip, gzip, halt, head, hexdump, hostid, hostname, httpd, hwclock, id, ifconfig, init, insmod, ionice, ip, ipcalc, kill, killall, klogd, last, less, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, ls, lsmod, lzcat, lzma, lzop, lzopcat, md5sum, mdev, microcom, mkdir, mkfifo, mknod, mkswap, mktemp, modinfo, modprobe, more, mount, mt, mv, nameif, nc, netstat, nslookup, od, openvt, patch, pidof, ping, ping6, pivot_root, poweroff, printf, ps, pwd, rdate, readlink, realpath, reboot, renice, reset, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, run-parts, sed, seq, setkeycodes, setsid, sh, sha1sum, sha256sum, sha512sum, sleep, sort, start-stop-daemon, stat, strings, stty, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, taskset, tee, telnet, test, tftp, time, timeout, top, touch, tr, traceroute, traceroute6, true, tty, udhcpc, udhcpd, umount, uname, uncompress, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, watch, watchdog, wc, wget, which, who, whoami, xargs, xz, xzcat, yes, zcat takk@deb8:~/tmp$
あっけなくバージョンが表示されましたね。このようにバージョンが表示される場合は先頭行であることが多い気がします。ですので、headで一行表示して確認しましょう。
takk@deb8:~/tmp$ busybox | head -1 BusyBox v1.22.1 (Debian 1:1.22.0-9+deb8u1) multi-call binary. takk@deb8:~/tmp$
次はlistの5行目のbzcmpです。
いきなり引数なしを実行したいと思います。
takk@deb8:~/tmp$ bzcmp Usage: bzcmp [cmp_options] file [file] takk@deb8:~/tmp$
使用方法は表示されますが、バージョンオプションはなさそうです。念の為manも確認します。
BZDIFF(1) General Commands Manual BZDIFF(1) 名前 bzcmp, bzdiff - bzip2 圧縮されたファイルを比較する 書式 bzcmp [ cmp_options ] file1 [ file2 ] bzdiff [ diff_options ] file1 [ file2 ] 説明 bzcmp と bzdiff は bzip2 圧縮されたファイルに対し、それぞれ cmp と diff プログラムを呼び出すために使われる。 指定されたすべてのオプションは cmp や diff に直接渡される。 ファイルが 1 つしか指定されていない場合、比較 されるファイルは file1 と file1.bz2 を伸長したファイルである。 2 つの ファイルが指定された場合、必要であれば伸長を行ってから、 cmp や diff に 渡される。 終了状態は cmp や diff のものが採用される。 関連項目 cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1) バグ cmp や diff プログラムのメッセージは、指定されたファイル名ではなく、 テ ンポラリのファイル名を参照する。 BZDIFF(1) (END):
バージョンオプションはなさそうです。manから別のコマンドを呼び出しすることはわかりましたが、bzcmpとbzdiffが同じマニュアルとなっているのは何故でしょう。
シンボリックリンクなのか確認します。
takk@deb8:~/tmp$ ls -l /bin/bzcmp lrwxrwxrwx 1 root root 6 3月 28 2015 /bin/bzcmp -> bzdiff takk@deb8:~/tmp$
やはりシンボリックリンクでした。
では、bzdiffを同じように見ていきます。
takk@deb8:~/tmp$ bzdiff Usage: bzdiff [diff_options] file [file] takk@deb8:~/tmp$
bzcmpと同様、使い方が表示されました。
それにしても、bzcmpはbzdiffのシンボリックリンクですが、実行した時の結果が異なるのは何故でしょうか。
bzdiff本体をfileコマンドで確認します。
takk@deb8:~/tmp$ file /bin/bzdiff /bin/bzdiff: POSIX shell script, ASCII text executable takk@deb8:~/tmp$
なんと、スクリプトでしたね。
takk@deb8:~/tmp$ wc -l !$ wc -l /bin/bzdiff 76 /bin/bzdiff takk@deb8:~/tmp$
行数が少ないので全catします。
takk@deb8:~/tmp$ cat -n !$ 1 #!/bin/sh 2 # sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh 3 4 # Bzcmp/diff wrapped for bzip2, 5 # adapted from zdiff by Philippe Troin <phil@fifi.org> for Debian GNU/Linux. 6 7 # Bzcmp and bzdiff are used to invoke the cmp or the diff pro- 8 # gram on compressed files. All options specified are passed 9 # directly to cmp or diff. If only 1 file is specified, then 10 # the files compared are file1 and an uncompressed file1.gz. 11 # If two files are specified, then they are uncompressed (if 12 # necessary) and fed to cmp or diff. The exit status from cmp 13 # or diff is preserved. 14 15 PATH="/usr/bin:/bin:$PATH"; export PATH 16 prog=`echo $0 | sed 's|.*/||'` 17 case "$prog" in 18 *cmp) comp=${CMP-cmp} ;; 19 *) comp=${DIFF-diff} ;; 20 esac 21 22 OPTIONS= 23 FILES= 24 for ARG 25 do 26 case "$ARG" in 27 -*) OPTIONS="$OPTIONS $ARG";; 28 *) if test -f "$ARG"; then 29 FILES="$FILES $ARG" 30 else 31 echo "${prog}: $ARG not found or not a regular file" 32 exit 1 33 fi ;; 34 esac 35 done 36 if test -z "$FILES"; then 37 echo "Usage: $prog [${comp}_options] file [file]" 38 exit 1 39 fi 40 set $FILES 41 if test $# -eq 1; then 42 FILE=`echo "$1" | sed 's/.bz2$//'` 43 bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE" 44 STAT="$?" 45 46 elif test $# -eq 2; then 47 case "$1" in 48 *.bz2) 49 case "$2" in 50 *.bz2) 51 F=`echo "$2" | sed 's|.*/||;s|.bz2$||'` 52 tmp=`mktemp "${TMPDIR:-/tmp}"/bzdiff.XXXXXXXXXX` || { 53 echo 'cannot create a temporary file' >&2 54 exit 1 55 } 56 bzip2 -cdfq "$2" > "$tmp" 57 bzip2 -cdfq "$1" | $comp $OPTIONS - "$tmp" 58 STAT="$?" 59 /bin/rm -f "$tmp";; 60 61 *) bzip2 -cdfq "$1" | $comp $OPTIONS - "$2" 62 STAT="$?";; 63 esac;; 64 *) case "$2" in 65 *.bz2) 66 bzip2 -cdfq "$2" | $comp $OPTIONS "$1" - 67 STAT="$?";; 68 *) $comp $OPTIONS "$1" "$2" 69 STAT="$?";; 70 esac;; 71 esac 72 else 73 echo "Usage: $prog [${comp}_options] file [file]" 74 exit 1 75 fi 76 exit "$STAT"
なるほどコマンドにバージョンがないのは、スクリプトを見よう、ということでしょうね。
bzcmpもbzdiffもbzip2のラッパーのようです。
コメント
[…] 「コマンドのバージョン確認(busybox/bzcmp)」の続きです。次のリストのbzdiffまで見ました。 […]