NetBSD Advent Calendar 2024 10日目の記事です。今日はNetBSD-10で新たに追加されたユーザランドのコマンドを見てみようと思います。
NetBSD-10のリリースノートの"New userspace programs"に新たに追加されたコマンドの説明があります。どうやら以下のコマンドが追加されているようです。
これらのコマンドを順に見てみます。
aiomixer(1)
aiomixer(1)はcurses(3)ベースのオーディオミキサーです。音量などはCUIツールのmixerctl(1)でも設定可能ですが、設定したい値(パラメータ)をその都度確認して設定するのはちょっと面倒です…。
$ mixerctl -a | grep master
outputs.master=127,127
$
$ # 音量を設定する。
$ mixerctl -w outputs.master=140,140
outputs.master: 127,127 -> 143,143
aiomixerを使用することで、CUIでも音量やミュートと言ったサウンドデバイスで頻繁に設定する項目を楽に設定できます。
realpath(1)
realpath(1)は相対パスを絶対パスに変換(正規化)するコマンドです。
$ realpath /usr/src
/usr/src
$
$ realpath /usr/src/../../usr/src/../src
/usr/src
manページを見ると、FreeBSD-4.3で追加された realpath(3)
をNetBSD-10に取り込んだという経緯のようです(逆に今までNetBSDに入ってなかったのか…とも思います)。また、その際にGNU Coreutils版のrealpath(3)との互換性を高める修正が追加されているとのことです。
tradcpp(1)
tradcpp(1)はK&RスタイルのCマクロ・プロセッサです。Cコンパイラがインストールされていない環境でCプリプロセッサの利用を想定し(設定ファイルでCプリプロセッサマクロを使用するケースがあるのだとか)、ベースコマンドに含めているとのこと。
例として、以下のようなCプリプロセッサマクロの展開を考えてみます。
/* foo.h */
#include <bar.h>
#include <bar.h>
char str[] = STR
char join_str[] = JOIN_STR(HELLO, WORLD)
/* bar.h */
#ifndef BAR_H
#define BAR_H
#define STR "HELLO"
#define JOIN_STR(x, y) x ## y
#endif /* BAR_H */
tradcpp
でプリプロセッサに通してみます。ifndef
による多重インクルードガードとマクロ定数の展開は行えますが、 ##
によるシンボルの連結は行えないようです。
$ tradcpp -I. bar.h
$ tradcpp -I. foo.h
...
char str[] = "HELLO"
char join_str[] = HELLO ## WORLD
cpp
コマンドであれば、 ##
によるシンボルの連結も行えます( ##
記法はK&Rスタイルのプリプロセッサではサポートされていないという話かと思います)。
$ cpp -I. foo.h
# 1 "foo.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.h"
# 1 "./bar.h" 1
# 4 "foo.h" 2
char str[] = "HELLO"
char join_str[] = HELLOWORLD
ioctlprint(1)
ioctlprint(1)はioctl(2)で指定可能なリクエストの一覧を出力するコマンドです。
$ ioctlprint -l
DRVRESUMEDEV _IOW('D', 126, struct devpmargs) 0x8014447e
HPCFBIO_GDSPCONF _IOWR('H', 2, struct hpcfb_dspconf) 0xc0784802
...
KFILTER_BYNAME _IOWR('k', 1, struct kfilter_mapping) 0xc0186b01
TIOCSPGRP _IOW('t', 118, int) 0x80047476
$
$ ioctlprint -l | wc -l
1549
リクエスト一覧は得られるのですが、どのデバイスに対してリクエスト可能な値なのかがパッと見では分からないため、べつのコマンド(またはソースコード)と照らし合わせて使用する感じになりそうです。
testpat(6)
testpat(6)は端末上にテストパターンを表示するコマンドです。こちらもcurses(3)を使用しています。
warp(6)
warp(6)はCUIベースの"a real-time space war game"というゲームのようです。操作方法がよく分からずググってみたのですが、解説サイト等は見つけられませんでした。
ちなみに、このゲームはPerl言語で有名なLarry Wallさんによる作品とのことです。
fsck_udf(8)
fsck_udf(8))はUDF(Universal Disk Format)に対するファイルシステムのチェックと(必要に応じて)リペアを実行するコマンドです。インストールCDから起動した際にディスクのチェックを行うような機能を提供するコマンドと考えると理解しやすいかと思います。
まとめ
NetBSD-10で新たに追加されたユーザランドのコマンドをざっと眺めてみました。実運用での利用が想定されるものから、サンプル的な位置づけのものもあり、もう一歩踏み込んで使い込んでみるとより面白い発見がありそうです。