2013-11-23 :-)
_ [NetBSD]/usr/bin/shar を読む
shar は使ったことがなかったんだが、与えられたファイルリストをテキスト 1 つにまとめ、アーカイブとするものらしい。それ tar でいいんじゃないの。
shar よりも tar のほうが後に書かれたものなのだろうかと思ったけどそうでもないらしい。
shar の man より
HISTORY
The shar command appeared in 4.4BSD.
tar の man より
HISTORY
A tar command first appeared in Version 7 AT&T UNIX.
4.4BSD は 1994 年 6 月リリース ( BSD - 4.4BSD と派生 )
Version 7 AT&T UNIX は 1979 年リリース ( Version 7 Unix )
ううむ。謎
shar のコードを読む。
# ヒアドキュメントにより EOF までの文字列を印字する
cat << EOF
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
EOF
# for i in "$@" と同じ
# つまりスクリプトの引数 $1 $2 $3... をすべて処理する ( プロフェショナルシェルプログラミング p.98 )
for i
do
echo "# $i"
done
echo "#"
for i
do
if [ -d $i ]; then
echo "echo c - $i"
echo "mkdir -p $i > /dev/null 2>&1"
else
echo "echo x - $i"
echo "sed 's/^X//' >$i << 'END-of-$i'"
sed 's/^/X/' $i
echo "END-of-$i"
fi
done
echo exit
echo ""
exit 0
しかし shar コマンドがどういうものかかよく分からんので実際に使ってみる。
Man page of SHAR より、shar に対して実行。
% cd /usr/src/usr.bin/shar % shar `find . -print` | lv
こんなん出ました。出力されるものそれ自体がシェルスクリプトとなる。
# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # . # ./CVS # ./CVS/Repository # ./CVS/Entries # ./CVS/Template # ./CVS/Root # ./CVS/Tag # ./obj # ./Makefile # ./shar.1 # ./shar.sh # echo c - . mkdir -p . > /dev/null 2>&1 echo c - ./CVS mkdir -p ./CVS > /dev/null 2>&1 echo x - ./CVS/Repository sed 's/^X//' >./CVS/Repository << 'END-of-./CVS/Repository' Xsrc/usr.bin/shar END-of-./CVS/Repository echo x - ./CVS/Entries sed 's/^X//' >./CVS/Entries << 'END-of-./CVS/Entries' X/Makefile/1.8/Mon Mar 24 21:59:48 1997//Tnetbsd-6-0-RELEASE X/shar.1/1.11/Thu Aug 7 11:15:51 2003//Tnetbsd-6-0-RELEASE X/shar.sh/1.3/Thu Jun 30 02:36:35 2005//Tnetbsd-6-0-RELEASE XD END-of-./CVS/Entries echo x - ./CVS/Template sed 's/^X//' >./CVS/Template << 'END-of-./CVS/Template' XCVS: ---------------------------------------------------------------------- XCVS: CVSROOT cvs.NetBSD.org:/cvsroot XCVS: please use "PR category/123" to have the commitmsg appended to PR 123 XCVS: XCVS: Please evaluate your changes and consider the following. XCVS: Abort checkin if you answer no. XCVS: => For all changes: XCVS: Do the changed files compile? XCVS: Has the change been tested? XCVS: => If you are not completely familiar with the changed components: XCVS: Has the change been posted for review? XCVS: Have you allowed enough time for feedback? XCVS: => If the change is major: XCVS: => If the change adds files to, or removes files from $DESTDIR: XCVS: => If you are changing a library or kernel interface: XCVS: Have you successfully run "./build.sh release"? END-of-./CVS/Template echo x - ./CVS/Root sed 's/^X//' >./CVS/Root << 'END-of-./CVS/Root' Xanoncvs@anoncvs.netbsd.org:/cvsroot END-of-./CVS/Root echo x - ./CVS/Tag sed 's/^X//' >./CVS/Tag << 'END-of-./CVS/Tag' XNnetbsd-6-0-RELEASE END-of-./CVS/Tag echo c - ./obj mkdir -p ./obj > /dev/null 2>&1 echo x - ./Makefile sed 's/^X//' >./Makefile << 'END-of-./Makefile' X# $NetBSD: Makefile,v 1.8 1997/03/24 21:59:48 christos Exp $ X# @(#)Makefile 8.1 (Berkeley) 6/6/93 X :
_ [NetBSD]/usr/bin/zgrep と /usr/bin/zegrep と /usr/bin/zfgrep を読む
3 つとも中身は同じ。
% diff3 /usr/bin/zgrep /usr/bin/zfgrep /usr/bin/zegrep
スクリプト冒頭で自分がどのコマンドとして呼び出されたのか判定している。
prg=$0
# handle being called 'zegrep' or 'zfgrep'
case ${prg} in
*zegrep)
grep_args="-E";;
*zfgrep)
grep_args="-F";;
esac
正味の処理。zcat でフィルタしてから grep する
# call grep ...
if [ $# -lt 1 ]
then
# ... on stdin
${zcat} -fq - | ${grep} ${grep_args} -- "${pattern}" -
else
# ... on all files given on the command line
if [ ${silent} -lt 1 ]; then
grep_args="-H ${grep_args}"
fi
while [ $# -gt 0 ]
do
${zcat} -fq -- "$1" | ${grep} --label="${1}" ${grep_args} -- "${pattern}" -
shift
done
fi
その zcat はここにある。
/usr/src/distrib/utils/zcat/
これはシェルスクリプトではなく C のコードである。
main() に注目する。ようするに zlib の関数を呼び出して展開 gz_uncompress() している。
int main(int argc, char *argv[])
{
gzFile zfp;
/* save program name and skip */
prog = argv[0];
argc--, argv++;
/* ignore any switches */
while (*argv && (**argv == '-')) {
argc--, argv++;
}
if (argc == 0) {
zfp = gzdopen(fileno(stdin), "rb");
if (zfp == NULL)
error("can't gzdopen stdin");
gz_uncompress(zfp, stdout);
return 0;
}
do {
/* file_uncompress(*argv); */
zfp = gzopen(*argv, "rb");
if (zfp == NULL) {
fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
exit(EXIT_FAILURE);
}
gz_uncompress(zfp, stdout);
} while (argv++, --argc);
return 0; /* to avoid warning */
}
_ [NetBSD]/usr/bin/zforce を読む
圧縮ファイルに拡張子が無かったらファイル名を変更する。
while test $# -ne 0; do
case "$1" in
# 拡張子に .gz や .tgz などが無ければ処理する。
*[._-]gz)
shift
;;
*.t[ag]z)
shift
;;
*)
# file の出力に "gzip compressed data" が含まれていれば処理する
if file "$1" |
grep -q "gzip compressed data" 2> /dev/null
then
# ファイル名の末尾に .gz を追加する
n="$1".gz
if mv "$1" "$n" 2> /dev/null; then
echo "$1" -- renamed to "$n"
else
ret=1
echo $prog: cannot rename "$1" to "$n"
fi
fi
shift
;;
esac
done
exit $ret









アルティメットまどかと悪魔ほむらのシルエットってさ、ridge racerシリーズのangelusまたはarchangelの天使の紋章のシルエットに似ているように見えるかい?
いやあ割りとよくあるシルエットなんじゃないかなあ http://www.bandainamcogames.co.jp/cs/list/ridgeracers2_psp/special/