サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
都知事選
blog.bsdhack.org
パイプコマンド中の終了ステータス取得 シェルスクリプトでは頻繁に複数のコマンドをパイプで連結して使用するが、 パイプの途中のコマンドの終了ステータスは通常では参照できない。 そこでリダイレクトを利用してパイプの途中のコマンドの 終了ステータスを取得する方法を考えてみる。 1exec 3>&1 2ret1=`{ { command1; echo $? 1>&3; } | command2; } 3>&1` 3ret2=$? exec を利用してあらかじめ FD3 を利用可能にしておき、 command1 の終了ステータスを FD3 に出力している。 command2 の実行後に FD3 の出力を FD1(標準出力) に変更しているので、 ret1 は標準出力から command1 の終了ステータスが取得できる。 command2 の終了ステータスはそのまま $? を参照して ret2 に格納
シェルスクリプトで便利な小技 シェルスクリプトを作成するときに知っておくと便利な小技集。 exec > ファイル 以降の標準出力を全て ファイル に出力するので この設定をしておくと簡単な実行ログが取得出来る。 同様に exec 2> ファイル とすると 標準エラー出力が全て ファイル に出力されるので エラーログが取得できる。 当然 exec > ファイル 2>&1 とすれば 標準出力も標準エラー出力も取得できる。 ファイル に /dev/null を指定すれば スクリプト実行中の出力は全て抑止されるので、 cron (8) から実行される場合などでは便利な場合もある。 1#!/bin/sh 2 3exec 2> ${TMP:-/tmp}/myname.log 4 : set -e スクリプト実行時に制御文以外でエラーが発生した場合に スクリプトを終了させる。 スクリプト中で実行すべきコ
英辞郎の辞書をコマンドラインから参照してみる 英単語の意味を調べるのに man(1) を使ってしまう人に贈る1行 という記事を拝見して、 自分の FreeBSD マシンで英辞郎の辞書を参照している方法を記事にしてみる。 要は英辞郎の辞書を EPWING 型式に変換して ndt サーバ経由で ndtpc コマンドから検索しているだけで、 検索コマンド自体は 1 行だが多少準備が必要となる。 英辞郎、和英辞郎、略辞郎、音辞郎の辞書を変換する。 英辞郎の辞書を EPWING 型式に変換するのは ports を利用すれば 何の問題もなく可能だ (若干ディスク容量が必要だが、 今となっては問題とならない容量だと思う)。 作業は英辞郎の CD-ROM をマウントした状態で実施すれば良いのだが、 CD-ROM は I/O が遅いのでローカルのファイルシステムに 辞書ファイルをコピーして実行しても良い。
grep & awk grep "^HOGEHOGE" file | awk 'BEGIN { FS = "="}; { print $2 }' というコード。一見何も問題ない様に見えるし確かに動作はするが、 CPU とプロセスと時間の無駄遣いである。 awk (1) には拡張正規表現が実装されているで、 awk 'BEGIN{FS="="}/^HOGEHOGE/{ print $2 }' file とすれば grep (1) の分だけ CPU やプロセス、時間が節約できる。 sed -n '/^HOGEHOGE/s/^.*=//p' file とするのも等価かな。 行指向の処理であれば煩雑な awk (1) よりも sed (1) の方が見やすいので、 個人的には sed (1) を利用した方法がお勧め。 シェルスクリプトに限らずスクリプト言語で記述されたプログラムは、 source f
posix shell で標準入力同士の diff (1) を実現する方法 コマンド command1 の出力結果と コマンド command2 の出力結果を diff (1) で比較したい場合、 一番手軽なのはそれぞれの出力を一時ファイルに出力して比較する方法である。 $ command1 > ${TMP:-/tmp}/output1 $ command2 > ${TMP:-/tmp}/output2 $ diff ${TMP:-/tmp}/output1 ${TMP:-/tmp}/output2 : $ rm ${TMP:-/tmp}/output1 ${TMP:-/tmp}/output2 しかし、この方法では一時ファイルを作成するので 処理効率が悪く一時ファイルの削除など後処理をする必要がある。 例えば bash (1) の場合は以下の様にする事で簡単に比較できる。 $ diff
ファイルのオーバーライド 通常のパイプ動作するフィルタコマンドでは 元ファイルを直接オーバライドできない。 例えば sort (1) の -o オプションの様に 元ファイルのオーバライド指定ができる (この動作をスポンジ動作というらしい)もの以外での処理について。 一番簡単で誰でも思いつくのが一時ファイルを利用するやりかた。 $ command < foo.dat > foo.new $ mv foo.new foo.dat この方法だと command の実行中に割込が発生したりすると 一時ファイルが残ってしまい美しくない。 $ cat foo.dat | ( sleep 1; command > foo.dat) この方法だと sleep (1) の時間がうっとおしく、 データ量や command の速度などによって失敗する場合もありうる。 $ (rm foo.dat; command
htaccess で特定のファイルのみパスワードを要求しない Web コンテンツを保護するために .htaccess ファイルを用いて Basic 認証などを実施する場合は多い。 通常 .htaccess はディレクトリ単位で有効になってしまうのだが、 あるディレクトリのアクセスを Basic 認証でアクセス制御したいが 特定のファイルについては認証を要求しない設定を行いたい場合は Files ディレクティブと Satisfy ディレクティブで実現できる。 AuthType Basic AuthUserFile 認証用ファイル AuthName "Enter password" Require valid-user <Files "認証要求しないファイル"> Satisfy Any Allow from all </Files> Satisfy ディレクティブは Allow ディレクティブ
シェルスクリプトで疑似乱数を取得する gnu bash には ${RANDOM} というシェル変数が用意されていて、 アクセスするたびに疑似乱数(風)の値が取得できる様だ。 しかし posix 準拠の機能ではなく bash 独自の機能なので拡張性がない。 そこで汎用的な疑似乱数取得の方法として awk (1) を利用した方法を使ってみる。 awk (1) には rand() という関数が組込まれているので 乱数生成ができる。 その際に利用される種(seed)は srand() という関数で初期化できるので、 これらを利用する事でそこそこの精度の疑似乱数は取得できる。 たとえば 0 〜 m までの疑似乱数は 取得した値から m の剰余を取ることで取得できる。 ただし awk (1) の rand() は仕様として 0 〜 1 までの桁数不定の少数を返すので、 乱数として利用する場合には整数に
QuickLook と日本語 QuickLook によるテキストファイルの表示で、 日本語のファイルが文字化けしたり表示できなかったりする原因の一つに、 ファイルの拡張属性にエンコーディング情報が格納されているかどうかがある。 ターミナルを起動して xattr を実行すると エンコーディング情報が格納されているか確認できる。 $ xattr -p com.apple.TextEncoding ファイル No such xattr: com.apple.TextEncoding この様な結果の場合、 エンコーディング情報が格納されていないので QuickLook で表示できない事があるが、 $ xattr -p com.apple.TextEncoding ファイル SHIFT_JIS;2561 この場合だと、殆ど QuickLook で表示できる様だ。 標準のテキストエディットでファイルを
アプリケイションを Dock に表示させない 通常のアプリケイションは起動すると Dock にアプリケイションのアイコンが表示される。 これはこれで便利なのだが、 MacBook など画面が狭い場合は Dock が拡がりすぎるので邪魔になってしまう。 その様な場合は、アプリケイションの info.plist に NSUIElement という Key を追加し、値に 1 を指定し Dock を再起動するとアイコンが表示されなくなる。 Property List Edit で編集しても構わないが、 ターミナルから以下のコマンドを実行する事でも設定できる。 $ sudo defaults write アプリケイションのフルパス名/Contens/Info LSUIElement -string 1 $ sudo chmod 644 アプリケイションのフルパス名/Contens/Info.pli
起動時に任意のコマンドを実行する Mac OS X 10.5 以降で起動時に任意のコマンドを自動で実行したい場合、 本来であれば launchd (8) を使用した制御が必要なので /System/Library/LanchDaemons/ 以下に plist ファイルを準備する必要がある。 しかし、/Library/StartupItems に コマンド起動用のスクリプトファイルを設置する事により 任意のコマンドを起動できるので、 unix 系のシェルスクリプトに慣れている場合は こちらの方が使いやすい場合もある。 /Library/StartupItems に任意の名称 (ここではサービス名とする)でディレクトリを作成する。 # mkdir /Library/StartupItems/サービス名 作成したディレクトリに任意の名称で起動スクリプトを作成する スクリプトファイルは サービス
このページを最初にブックマークしてみませんか?
『blog.bsdhack.org』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く