reroの日記

2013-12-19-Thu

Solaris における sh builtin な echo挙動

Solaris において,#!/bin/shシェルスクリプト内で,絶対パス指定無しの echo を使った場合挙動の話.

背景

Solaris (SunOS) には System V 系のコマンド群と BSD 系のコマンド群の両方が含まれている.

これらのコマンド挙動は大きく異なり,例えば echo コマンドで行末改行無しで hoge と出力したい場合

System V 系では echo 'hoge\c' とし,BSD 系では echo -n hoge とする.

(bash builtin な echoデフォルトBSD 系.ただし,echo -e とすると System V 系の動作にも対応する (-e と -n は併用できる))

また,SunOS 4.x (Solaris 1.x) 以前と Solaris 2.0 (SunOS 5.0) 以降はベース OS が異なる.

SunOS 4.x 以前は BSD ベースSolaris 2.0 以降は System V ベース

結論

Solaris 2.0 以降の場合

環境変数 PATH において /usr/bin (/bin) と /usr/ucb のどちらが先に登録されているかによって挙動が変わる.

/usr/bin が先の場合,System V 系の挙動になる (/usr/bin/echo や /bin/echo と同じ挙動).

/usr/ucb が先の場合BSD 系の挙動になる (/usr/ucb/echo と同じ挙動).

ただし,これは PATH検索された echo コマンドsh builtin な echo として使用しているという意味ではない.

反証として,PATH=$HOME/bin:/usr/bin:/usr/ucb な環境下で,$HOME/bin/echo を /usr/bin/echo と /usr/ucb/echo の好きな方に切り替えても,

切り替えは反映されず,純粋PATH における /usr/bin と /usr/ucb の登録順で挙動が変わる.

 (PATH文字列的に解析して挙動を切り替えていると考えられる)

Solaris 10 における検証結果を後述する.

SunOS 4.x 以前の場合

環境変数 PATH において /usr/bin と /usr/5bin のどちらが先に登録されているかによって挙動が変わる.

/usr/bin が先の場合BSD 系の挙動になる.

/usr/5bin が先の場合,System V 系の挙動になる.

検証できる環境が無かったため,公式 (Oracle) のドキュメント引用する.

検証

Solaris 10 における検証結果は下記の通り.

シェルスクリプト
cat test-sh-echo.sh
#!/bin/sh

echo /bin
PATH=/bin:/usr/ucb:/usr/bin
export PATH
which echo
echo -n hoge
echo "fuga\c"

echo; echo
echo /usr/bin
PATH=/usr/bin:/usr/ucb:/bin
export PATH
which echo
echo -n hoge
echo "fuga\c"

echo; echo
echo /usr/ucb
PATH=/usr/ucb:/bin:/usr/bin
export PATH
which echo
echo -n hoge
echo "fuga\c"

echo; echo
echo ~/bin, /bin
PATH=~/bin:/bin:/usr/ucb:/usr/bin
export PATH
which echo
ls -l $HOME/bin/echo  # $HOME/bin/echo -> /usr/ucb/echo
echo -n hoge
echo "fuga\c"

echo; echo
echo ~/bin, /usr/ucb
PATH=~/bin:/usr/ucb:/bin:/usr/bin
export PATH
which echo
ls -l $HOME/bin/echo  # $HOME/bin/echo -> /usr/ucb/echo
echo -n hoge
echo "fuga\c"
/bin/sh場合

PATH において /bin や /usr/bin が先の場合,System V 系の挙動

PATH において /usr/ucb が先の場合BSD 系の挙動

PATH において $HOME/bin が最速でも,$HOME/bin/echo挙動には左右されない.

% ./test-sh-echo.sh
/bin
/bin/echo
-n hoge
fuga

/usr/bin
/usr/bin/echo
-n hoge
fuga

/usr/ucb
/usr/ucb/echo
hogefuga\c


~/bin, /bin
/home/user1/bin/echo
lrwxrwxrwx   1 user1 user1       13 Dec 18 00:00 /home/user1/bin/echo -> /usr/ucb/echo
-n hoge
fuga

~/bin, /usr/ucb
/home/user1/bin/echo
lrwxrwxrwx   1 user1       13 Dec 18 00:00 /home/user1/bin/echo -> /usr/ucb/echo
hogefuga\c
%
/bin/bash場合

シェルスクリプトシェバングのみを /bin/bash に変更して実行.

・全てのケースにおいて BSD 系の挙動

% ./test-bash-echo.sh
/bin
/bin/echo
hogefuga\c


/usr/bin
/usr/bin/echo
hogefuga\c


/usr/ucb
/usr/ucb/echo
hogefuga\c


/home/user1/bin, /bin
/home/user1/bin/echo
lrwxrwxrwx   1 user1 tornado       13 Dec 18 00:00 /home/user1/bin/echo -> /usr/ucb/echo
hogefuga\c


/home/user1/bin, /usr/ucb
/home/user1/bin/echo
lrwxrwxrwx   1 user1       13 Dec 18 00:00 /home/user1/bin/echo -> /usr/ucb/echo
hogefuga\c
%

公式 (Oracle) のドキュメント

Solaris 移行ガイド付録 A コマンドリファレンス

http://docs.oracle.com/cd/E19620-01/805-5828/6j5ggprcb/ (Solaris 2.6)

http://docs.oracle.com/cd/E19455-01/806-2724/6jbu1b2cg/ (Solaris 7)

SunOS 4.x から Solaris 2.6 や Solaris 7 への移行について記載されている.

から話題に関係する行/列の記載のみ抜粋

スペースの都合で Solaris 2.6 と Solaris 7 の記載を併記.

明らかな誤植は修正.

SunOS 4.x コマンド : sh(1)

利用可能な代替コマンドと注 :

[Solaris 2.6] SunOS 4.x では、組み込みコマンド echo および test の動作は、環境変数 PATH における /usr/bin と /usr/5bin との相対的な位置に依存する。現在では /usr/ucb と /usr/bin の相対的な並び換えによって動作が決まる。

[Solaris 7] SunOS 4 では、組み込みコマンド echo および test の動作は、環境変数 PATH における /usr/bin と /usr/5bin との相対的な位置に依存する。現在では /usr/ucb と /usr/bin の相対的な並び換えによって動作が決まる。

SunOS 4.x コマンド : echo(1V)

利用可能な代替コマンドと注 :

[Solaris 2.6] -n オプションSunOS 4.x では改行を抑止した。SunOS 5.6 では \c を使用する。

[Solaris 7] -n オプションSunOS 4 では改行を抑止した。SunOS 5.7 では \c を使用する。

トラックバック - http://d.hatena.ne.jp/rero/20131219

2010-03-24-Wed

明利酒類 梅酒 うめ物語

明利酒類 梅酒 うめ物語 500ml

梅酒 うめ物語

コみケッとスペシャル5 in 水戸」の会場で販売されていたという梅酒で,パッケージイラスト蒼樹うめさん (ひだまりスケッチの人).

コミケ会場や酒屋オフィシャル通販ではなく楽天店舗で買った.しかし,透明な梱包で配送とか外道すぎる.

ますます 2010/03/25 04:22 酒屋オフィシャル通販の方で買ったら段ボールに詰められてましたよ。
まぁうめ物語だけでなく他のものと一緒に買ったからかも知れませんが。

rerorero 2010/03/25 09:26 単品購入の時点で敗北は確定的だったわけか.しかし「水戸の美酒 萩野谷なか」とか一緒に買ってたら被害が拡大していた可能性も….酒屋オフィシャルなら百年梅酒とか副将軍でよかったかもしれないが.

トラックバック - http://d.hatena.ne.jp/rero/20100324

2010-03-09-Tue

Project DIVA Arcade♪特製ICカード

ミクの日感謝祭 39's Giving Day

寒くて死ぬかと思ったZepp Tokyo のスタンディング収容人数 2,709 人中,整理券番号 2,600 番台だったので,入場するのにみぞれの降る中 1 時間半待った.後で気付いたが,整理券番号順に入場するんだから,馬鹿正直に外で待つ必要なかったのな.

物販やゲーム試遊は人大杉で無理そうだった.タオルくらいは買おうと思っていたけど,ライブ終了後じゃさすがに売り切れていた.あと,今回の客はよく訓練されていないのか,物販スペースが押しくらまんじゅうになってて危なかった.

39のひ・み・つ(続)はセガ広報でミクに詳しい馬場さんのボケがなかったら場を持たせるのが大変だったと思う.

ミク・ルカ・リンレンは色鮮やかでよく動いていた.スクリーンの特性なのか,自分立ち位置から離れる方向にキャラが動くと色が薄くなってたけど.今回もミクFESみたいに髪の揺れるミクと揺れないミクと2種類のモデルが居たみたい.あと,ルカのダブルラリアットのモーションはむしろバニシングフラットっぽい.

曲間の休み時間はほとんど無く,ドラムの人乙って感じだった.ドラム含め演奏してた人たちはやたらうまかった気がする.今回はプロの人なのかな?曲目はミクの StargazeR やリンの炉心融解以降の曲,特に SPiCaメルトあたりは盛り上がっていた気がする.

たきったたきった 2014/09/14 16:15 このICまだもってらっしゃいますか??

rerorero 2014/09/14 16:53 持ってるけど,一応思い出の品だから有償/無償を問わず譲れないよ.

たきったたきった 2014/09/14 17:29 そうですか…譲ってもらえると嬉しかったんですが、それだと仕方ないですね(´・c_・`)返事ありがとうございました!

トラックバック - http://d.hatena.ne.jp/rero/20100309

2010-03-02-Tue

ハッピーターン ハッピーパウダー 200%
トラックバック - http://d.hatena.ne.jp/rero/20100302

2010-01-22-Fri

ウイスキー・ブランデー ミニチュアボ

ウイスキーブランデー ミニチュアボトル

トラックバック - http://d.hatena.ne.jp/rero/20100122

2010-01-11-Mon

Project DIVA Arcade IC カード

Project DIVA Arcade 第一期ロケテストクラブセガ秋葉原

8:40 頃到着して整理券 90 番台.プレイできたのは 21:40 頃と 13 時間待ち.

NORMAL で MAGICAL SOUND SHOWER と片思いサンバプレイ.STANDARD と GREAT でした.

当日はとてもうまい方がいましたので撮影させていただきました.許可もいただけたようですので公開します.

D

黒猫夜黒猫夜 2010/01/14 00:42 東京うらやましす。

って、13時間……だと……。

rerorero 2010/01/15 03:26 整理券もらった後は自分の順番までどこで待ってもよいのですよ.でも番号が呼ばれたときにいなかったらキャンセル扱いなので,そわそわしながらご飯のとき以外はほとんど店内にいましたとさ.先着 100 名は確定で IC カードがもらえるからか,結局キャンセルになる人は見なかったわけだけど.

トラックバック - http://d.hatena.ne.jp/rero/20100111

2010-01-10-Sun

Microsoft Wireless Mobile Mouse 4000 で Picasa 3 と連携不具合

Picasa 3 や Picasa フォト ビューアでマウスホイールスクロールがうまく動作しない.ホイール普通に回すとまったくスクロールせず,高速に回すと少しスクロールするがスクロール幅が調節できない.

Picasa フォト ビューアでマウスホイールによる拡大縮小が全く効かない.

IntelliPoint をインストールする前でも,IntelliPoint をインストールしても同様だった (インストールしたバージョンは 7.00.260.0.本体添付の CD のもの.Microsoft 公式 Web ページからダウンロードできる現状の最新版も同じ).

解決法

IntelliPoint の設定で「接続されているデバイス」に「Wireless Mobile Mouse 4000」ではなく「IntelliMouse Explorer 4.0」を設定.

拡大縮小に関しては拡大率 100% でスナップするため一見効かないように見えるが,100% から他の拡大率に変更する際は少し速めにホイールを回せばよい.

通行人通行人 2011/01/12 21:56 あるソフトでスクロールが効かなくて困っていたのですが、この方法で解決しました。ありがとうございました!

通行人2通行人2 2011/02/17 22:22 加速度設定がうまく有効にならなかったり、ビューアでの拡大縮小が効かず、諦めて返品を考えていましたが、この記事の方法で見事に解決しました。大変助かりました。ありがとうございました。

通行人3通行人3 2012/06/26 13:17 picasaでホイールが急に利かなくなり不便で困ってました。ワイヤレスではないですが、Microsoft製マウスだったのでもしやと思いIntelliPointをインストールしたところ解決しました。助かりました。ありがとうございますm(_ _)m

トラックバック - http://d.hatena.ne.jp/rero/20100110

2010-01-09-Sat

Windows 7 Ultimate x64 に NotepadBranch をインストール

2009-11-11 - - Letters from lanternj -

Windows 7 アプリケーション動作報告リスト - NotepadBranch

Windows XP 以前とは異なり,セーフモードでの起動は不要な模様.

まず,C:\Windows\notepad.exe と C:\Windows\SysWOW64\notepad.exe に対し,下記を実行 (C:\Windows\System32\notepad.exe は連動して権限が変更されるため不要).

1.所有者を TrustedInstaller から、Administratorsに変更する。

2.Administratorsに、フルコントロールの権限を与える。

次に,NotepadBranch を「管理者として実行」でインストール

最後に,インストールで置き換えられた C:\Windows\notepad.exe を C:\Windows\System32\notepad.exe と C:\Windows\SysWOW64\notepad.exe にもコピー

エディタの指定は,置き換えられた notepad.exe の初回起動,または「スタートメニュー → すべてのプログラム → BnasSoft → NotepadBranchの設定」から.

Windows 7 Ultimate x64bluewindインストール

bluewind&単機能ツール集 再配布所

開発版 (bluewind170b30) をインストール

・「bluewindの設定 → 入力 → 候補リストローマ字マッチングを使用」は無効化する.1 文字入力するごとに下記エラーメッセージで怒られるため.便利なのに….

モジュール 'bluewind.exe' のアドレス 00466BF7 でアドレス 00000004 に対する読み込み違反がおきました。

・呼び出しキーはデフォルトWin+Space から変更.Windows 7デスクトップガジェットの表示と衝突するため.Ctrl+Space も xyzzy の Mark set と衝突するので,自分は Shift+Ctrl+Space に変更.

トラックバック - http://d.hatena.ne.jp/rero/20100109

2009-12-21-Mon

SANYO eneloop tones HR-3UTGA-8TN

エネループ 限定モデル・8色パック

トラックバック - http://d.hatena.ne.jp/rero/20091221

2009-12-19-Sat

WindowsCompactFlash (複数のパーティションを含む) をディスクイメージ

結論としては,Cygwindd でいけた (当然,UNIXOS付属dd でいけるはず).

背景

ANS-9010 のバックアップ先の CompactFlash の内容 (Windows 7インストールイメージ) をディスクイメージとして取り出す目的で.

Windows 7インストールドライブの先頭 100MB にはシステム予約の別パーティションが作成されるため,バックアップ先の CompactFlash には 2 パーティションが含まれてしまう.この CompactFlashメディアリーダーWindows認識させると,先頭 100MB だけにドライブレターが割り当てられる.それ以外の領域に「ディスク管理」でドライブレターを割り当てようとしたが,下記のエラーが出て無理だった.

ディスク管理コンソールのビューが最新の状態でないため、操作を完了できませんでした。タスクの最新の情報更新を使ってビューを最新の情報更新してください。問題が解消されない場合は、ディスク管理コンソールを閉じてからディスク管理またはコンピューター再起動してください。

Cygwindd を用いた方法

対象 CompactFlashデバイス名を調べ,dd や cat で取り出す.

rero@carnelian ~
$ cat /proc/partitions
major minor  #blocks  name

    8     0  14913023 sda
    8     1    102400 sda1
    8     2  14808064 sda2
    8    16 488386584 sdb
    8    17 488384001 sdb1
    8    32 1465138584 sdc
    8    33 1465136001 sdc1
    8    48  15761088 sdd  ← これが対象の CompactFlash
    8    49    102400 sdd1
    8    48  14808064 sdd

rero@carnelian ~
$ time dd if=/dev/sdd of=/cygdrive/d/win7_20091219_1.img bs=1M
dd: reading `/dev/sdd': No space left on device
15391+1 records in
15391+1 records out
16139354112 bytes (16 GB) copied, 913.007 s, 17.7 MB/s

real    15m13.093s
user    0m0.140s
sys     0m19.031s

rero@carnelian ~
$ time cat /dev/sdd > /cygdrive/d/win7_20091219_2.img

real    15m20.641s
user    0m2.406s
sys     0m25.093s

rero@carnelian ~
$ ls -l /cygdrive/d/win7_20091219_*.img
-rw-r--r-- 1 rero None 16139354112 Dec 20 01:20 /cygdrive/d/win7_20091219_1.img
-rw-r--r-- 1 rero None 16139354112 Dec 20 01:40 /cygdrive/d/win7_20091219_2.img

rero@carnelian ~
$ diff /cygdrive/d/win7_20091219_*.img

rero@carnelian ~
$ (両者に差分無し)

なお,Cygwin をあらかじめ「管理者として実行」しておかないと下記エラーメッセージで失敗する.

rero@carnelian ~
$ dd if=/dev/sdd of=/cygdrive/d/win7_20091219_1.img bs=1M
dd: opening `/dev/sdd': Permission denied

rero@carnelian ~
$ cat /dev/sdd > /cygdrive/d/win7_20091219_2.img
cat: /dev/sdd: Permission denied

試してみて駄目だった方法

DDforWindows (Silicon Linux による GUI 版)

http://www.si-linux.co.jp/wiki/silinux/index.php?DDforWindows

ディスク選択」で対象 CompactFlash を選べないため不可.

dd for Windows (chrysocome.net 版)

http://www.chrysocome.net/dd

dd --list で先頭 100MB のパーティションしか候補に挙がらなかったため不可.

Check Flash

http://www.forest.impress.co.jp/article/2008/11/04/checkflash.html

Access type が As logical drive ではドライブレター付きパーティションしか選べず,As physical drive では候補が全く表示されないため不可.

EASEUS Todo Backup

http://www.forest.impress.co.jp/docs/review/20090827_310851.html

リムーバブルディスクが候補に挙がらなかったため不可.

EASEUS Disk Copy

http://www.forest.impress.co.jp/article/2008/08/26/easeusdiskcopy.html

上のソフトと作者が同じ.ブータブル iso イメージによる配布だったので,めどくて試していない.

Disk2vhd

http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx

物理ディスクVHD 形式の仮想ディスク (Virtual PC や Hyper-V の使用形式) に変換できるマイクロソフト提供ツール.

VHD 形式は標準で Windows 7 からマウントできるらしい.

しかし,リムーバブルディスクが候補に挙がらなかったため不可.

また,仮に CompactFlash から読み出せたとしても,もう一度 CompactFlash に書き出せるのか不明確だった.

Windows 7 の標準機能 (「ディスク管理」や diskpart)

http://technet.microsoft.com/ja-jp/windows/dd875657.aspx

そもそも,VHD 仮想ディスクを新規作成する機能であり,物理ディスクからの変換はできない模様.

トラックバック - http://d.hatena.ne.jp/rero/20091219