shtool
http://www.ossp.org/pkg/tool/shtool/
iselect と同じ OSSP プロジェクトの shtool。
echo, mdate など ポータビリティの問題を解決するものや、ちょっと便利なコマンドが入っている。
Apache や OpenPKG でも使われているらしい。
echo
echo(1) と同じ。ポータビリティで問題になる -n を解決している。
- n, --newline 最後に改行を出力しない。
- e, --expand 以下の特殊文字を有効にする。
%B 強調文字モード開始
%b 強調文字モード終了
%u 現在のユーザ名
%U 現在のユーザID
%g 現在のグループ名
%G 現在のグループID
%h ホスト名
%d ドメイン名
%D 現在の日
%M 現在の月
%m 現在の月名(例:Nov)
%Y 現在の年
$ shtool echo -n -e "Enter your name [%B%u%b]: "; read name Enter your name [ao]: xyz $ shtool echo -e "Your Email address might be %u@%h%d" Your Email address might be ao@gokuraku.home.jp $ shtool echo -e "The current date is %D-%m-%Y" The current date is 19-Nov-2006
mdate
ファイルの最終更新日付を取得する。
- n, --newline 最後に改行を出力しない
- z, --zero ゼロパディングする。
- s, --shorten 月名を短縮形で表示する。
- d, --digits 月を数字で表示する。
- f, --field-sep str フィールドの区切り文字。
- o, --order spec 年月日の順序を指定する。デフォルトは "dmy"。
$ shtool mdate -n / 15 November 2006 $ shtool mdate -f '/' -z -d -o ymd foo.txt 2006/11/19 $ shtool mdate -f '-' -s foo.txt 19-Nov-2006
table
表を整形する。
- F, --field-sep sep 列の区切り文字。
- w, --width width 各列の幅。
- c, --column cols 列数。
- s, --strip strip これを超える文字は切り落とされる。デフォルトは79。
$ shtool table -F , -w 5 -c 4 "1,2,3,4,5,6,7,8,9,10,11,12" 1 2 3 4 5 6 7 8 9 10 11 12
prop
処理進行中を表すプロペラを回転させる。
- p, --prefix str プロペラの前に表示する文字列。
$ for i in {1..5}; do echo;sleep 1;done | shtool prop -p Running
move
mv(1) と同じ。ただし複数ファイルの一括リネームができたり、移動先と移動元に差異がない場合、タイムスタンプを変えないことができる。
- v, --verbose 冗長表示。
- t, --trace 実行するコマンドを表示する。
- e, --expand src のアスタリスクを展開し、dst-file において "%n" (n は 1,2...)で参照できるようにする。
- p, --preserve 移動先と移動元に差異がない場合、タイムスタンプを変えない。
$ shtool move -v -e '*.txt' %1.asc a.txt -> a.asc b.txt -> b.asc # Makefile にて scanner.c: scanner.l lex scanner.l shtool move -t -p lex.yy.c scanner.c
install
BSD install(1) と同様。
- v, --verbose 冗長表示。
- t, --trace 実行するコマンドを表示する。
- d, --mkdir ディレクトリを作成する。パーミッションは 755。
- c, --copy ファイルを移動でなくコピーする。
- C, --compare-copy -c と同様だが、コピー先に既に同一ファイルがあるときはコピーしない。
- s, --strip 実行ファイルを strip(1) する。
- m, --mode mode ファイルのパーミッションを mode に設定する。
- o, --owner owner ファイルの所有者を owner にする。
- g, --group group ファイルの所属グループを group にする。
- e, --exec sed-cmd ファイルに対して sed をかける。
# Makefile にて install: : shtool install -c -s -m 4755 foo $(bindir)/ shtool install -c -m 644 foo.man $(mandir)/man1/foo.1 shtool install -c -m 644 -e "s/@p@/$prefix/g" foo.conf $(etcdir)/
mkdir
mkdir(1) と同様。
mkln
ln(1) と同様。相対リンク自動計算機能つき。
mkshadow
ディレクトリ構造とその中身のファイルに対してシンボリックリンクによるシャドウツリーを作る。
- v, --verbose 冗長表示。
- t, --trace 実行するコマンドを表示する。
- a, --all 全ファイルに対してシャドウを作成。デフォルトでは CVS 関係のファイル・ディレクトリ、バックアップファイル、オブジェクトファイルのシャドウは作られない。
# shell script shtool mkshadow -v -a . /tmp/shadow
fixperm
パーミッションをそろえる(実行可能ファイルは 755。実行不能ファイルは 644。ディレクトリは 755)。
- v, --verbose 冗長表示。
- t, --trace 実行するコマンドを表示する。
# Makefile.in にて dist: shtool fixperm -v * ...
rotate
Linux の logrotate(8) または BSD の newsyslog(8) と同様。
# shell script にて shtool rotate -n10 -s1M -zbzip2:9 -d -r /var/log/ap.access.log shtool rotate -n5 -s128K -zbzip2:9 -d -r /var/log/ap.error.log apachectl graceful
tarball
ソースコードのリリース用の tar を作るのに便利なコマンド。
# Makefile.in にて dist: ... V=`shtool version -d short ...`; \ shtool tarball -o foobar-$$V.tar.gz -c 'gzip -9' \ -u bar -g gnu -e 'CVS,\.cvsignore' .
$ find . . ./hoge ./a ./a/lkj ./a/xxx.sarep ./a.sarep $ shtool tarball -v -e '.*\.sarep' . a/lkj hoge $ tar xvf out.tar x out/a/lkj x out/hoge
subst
in-place で sed をかける。実行前に変更点を diff で見て確認したり、ファイルのタイムスタンプを変えないで実行できたりする。
platform
プラットフォームを調べる。
$ shtool platform FreeBSD 5.3 (iX86) $ shtool platform -c -L -S "" -C "+" -F "%at-%st" i586-freebsd5.3
arx
ar(1) の拡張。.o だけでなく、.a も引数にとってまとめることができる。
slo
リンカオプションの "-L" と "-l" を分類する。分け方は 1.スタティックライブラリ、2. PIC("Position Independent Code") を含むスタティックライブラリ、3. 共有ライブラリ。
$ shtool slo -- -L /usr/local/lib -lgcc sage -L /usr/lib -l fetch SLO_ARGV="sa" SLO_DIRS_OBJ="-L/usr/lib -L/usr/local/lib" SLO_LIBS_OBJ="-lgcc" SLO_DIRS_PIC="" SLO_LIBS_PIC="" SLO_DIRS_DSO="-L/usr/lib" SLO_LIBS_DSO="-lfetch"
scpp
C プリプロセッサ。よくわからん。
version
バージョン情報を含むソースファイルを生成・更新する。対応言語は C, Perl, Python, m4。
$ shtool version -l c -n FooBar -p foobar -s 1.2b3 version.c new version: 1.2b3 (19-Nov-2006) $ cat version.c /* ** version.c -- Version Information for FooBar (syntax: C/C++) ** [automatically generated and maintained by GNU shtool] */ #ifdef _VERSION_C_AS_HEADER_ #ifndef _VERSION_C_ #define _VERSION_C_ #define FOOBARVERSION 0x102103 typedef struct { const int v_hex; const char *v_short; const char *v_long; const char *v_tex; const char *v_gnu; const char *v_web; const char *v_sccs; const char *v_rcs; } foobarversion_t; extern foobarversion_t foobarversion; #endif /* _VERSION_C_ */ #else /* _VERSION_C_AS_HEADER_ */ #define _VERSION_C_AS_HEADER_ #include "version.c" #undef _VERSION_C_AS_HEADER_ foobarversion_t foobarversion = { 0x102103, "1.2b3", "1.2b3 (19-Nov-2006)", "This is FooBar, Version 1.2b3 (19-Nov-2006)", "FooBar 1.2b3 (19-Nov-2006)", "FooBar/1.2b3", "@(#)FooBar 1.2b3 (19-Nov-2006)", "$Id: FooBar 1.2b3 (19-Nov-2006) $" }; #endif /* _VERSION_C_AS_HEADER_ */