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_ */ 

path

which(1) と同様。「-r サブディレクトリ」とすると、サブディレクトリからカレントディレクトリへの相対パスを表示する(例:../..)。