パッケージ内の隠れコマンドを見つける

前回binutilsにodコマンドがあると思ってた勘違いに気づきました。
コマンドがどのパッケージに含まれるかって、いつもapt-file searchを使ってますが、odが、binutilsに含まれるかを確認するには、

takk@deb9:~$ which od
/usr/bin/od
takk@deb9:~$ apt-file search /usr/bin/od | grep binutils
takk@deb9:~$ 

とやるだけで確認できましたね。
odは、coreutilsなので、coreutilsで検索すればヒットします。

takk@deb9:~$ apt-file search /usr/bin/od | grep coreutils
coreutils: /usr/bin/od
takk@deb9:~$ 

では、パッケージ名を指定して、パッケージ内にあるコマンドを確認するには、どうすれば良いかというと、apt-file listすればよいです。

takk@deb9:~$ apt-file list binutils | head
binutils: /usr/bin/addr2line
binutils: /usr/bin/ar
binutils: /usr/bin/as
binutils: /usr/bin/c++filt
binutils: /usr/bin/dwp
binutils: /usr/bin/elfedit
binutils: /usr/bin/gold
binutils: /usr/bin/gprof
binutils: /usr/bin/ld
binutils: /usr/bin/ld.bfd
takk@deb9:~$ 

これは手元にパッケージがなくても使えるコマンドですが、bin2cのようなインストールされないコマンドは、一覧に表示されないようです。

takk@deb9:~$ apt-file list binutils | grep bin2c
takk@deb9:~$

さて、特定パッケージ内で、bin2cのようなコマンドを見つけるにはどうすれば良いでしょうか。
ファイル名=コマンド名.cとなってることが多いので、たいていのコマンドは、main関数が存在する.cをgrepすれば、見つけることができます。
(検索するために、パッケージのソースは取得しておく必要があります)

では、binutilsに含まれるコマンド一覧を抽出してみます。
全ファイル数と、ランダムに10件ピックアップ。

takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | wc -l
529
takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | shuf | head
binutils/elfcomm.c
gas/config/tc-i386.c
bfd/elf32-sh.c
intl/localename.c
libiberty/strrchr.c
intl/textdomain.c
binutils/nlmconv.c
bfd/elf32-tilepro.c
bfd/elf64-ia64-vms.c
zlib/examples/zpipe.c
takk@deb9:~/src/binutils-2.28$ 

bin2c.cソースは、binutilsディレクトリでしたので、binutilsのみに絞ります。

takk@deb9:~/src/binutils-2.28$ grep -rl main * --include *.c | grep ^binutils | pr -t2
binutils/debug.c		    binutils/deflex.c
binutils/cxxfilt.c		    binutils/nlmconv.c
binutils/ar.c			    binutils/nlmheader.c
binutils/sysinfo.c		    binutils/addr2line.c
binutils/coffdump.c		    binutils/prdbg.c
binutils/ieee.c			    binutils/readelf.c
binutils/testsuite/binutils-all/tes binutils/srconv.c
binutils/bfdtest1.c		    binutils/bfdtest2.c
binutils/syslex.c		    binutils/wrstabs.c
binutils/nm.c			    binutils/arlex.c
binutils/rdcoff.c		    binutils/strings.c
binutils/dwarf.c		    binutils/dllwrap.c
binutils/elfcomm.c		    binutils/dlltool.c
binutils/sysdump.c		    binutils/elfedit.c
binutils/stabs.c		    binutils/objdump.c
binutils/windmc.c		    binutils/size.c
binutils/objcopy.c		    binutils/bin2c.c
binutils/od-macho.c		    binutils/windres.c
takk@deb9:~/src/binutils-2.28$ 

これをbasenameでディレクトリ名と拡張子.cを除いて一覧にします。

takk@deb9:~/src/binutils-2.28$ for i in  `grep -rl main * --include *.c | grep ^binutils`;do basename $i .c;done | pr -t3
debug			elfcomm			srconv
cxxfilt			sysdump			bfdtest2
ar			stabs			wrstabs
sysinfo			windmc			arlex
coffdump		objcopy			strings
ieee			od-macho		dllwrap
testprog		deflex			dlltool
bfdtest1		nlmconv			elfedit
syslex			nlmheader		objdump
nm			addr2line		size
rdcoff			prdbg			bin2c
dwarf			readelf			windres
takk@deb9:~/src/binutils-2.28$ 

これで、.cファイル名=コマンド名と見なして一覧ができました。
実際はインストール時はコマンド名が変わるものもあるので、apt-file listの結果とは一致しませんが、隠れコマンドは見つかるかと思います。

bin2cは、下から2行目の3列目にありますね。

コメント

タイトルとURLをコピーしました