bash に限らず、シェルはカスタマイズ次第で使い勝手が大きく変わる。
http://pc.2ch.net/test/read.cgi/unix/1013019416/
Working more productively with bash 2.x
http://www.caliban.org/bash/index.shtml#completion
以下、説明。
全く同じコマンドは重複して記録しないように ignoredups を設定。
- 参考になるページ
bash で補完スレhttp://pc.2ch.net/test/read.cgi/unix/1013019416/
Working more productively with bash 2.x
http://www.caliban.org/bash/index.shtml#completion
- 私の /etc/profile の中身
HISTSIZE=10000
HISTFILESIZE=10000
HISTCONTROL=ignoredups
export HISTSIZE HISTFILESIZE HISTCONTROL
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
alias ll='ls -l'
alias la='ls -aF'
alias lla='ls -al'
alias top='nice -10 top -d 2'
complete -d cd
complete -u {su,finger,chown}
complete -c man
complete -A stopped -P '%' bg
complete -j -P '%' fg jobs disown
complete -c command type which
PATH="$PATH":/usr/local/pgsql/bin
PG=/usr/local/pgsql
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PG/lib
export PGLIB=$PG/lib
export PGDATA=$PG/data
export http_proxy=http://10.241.4.1:10241/
export ftp_proxy=http://10.241.4.1:10241/
export https_proxy=http://10.241.4.1:10241/
以下、説明。
- 履歴とプロンプト
十分な数のコマンド履歴を保存したいので、十万までヒストリーを拡張。全く同じコマンドは重複して記録しないように ignoredups を設定。
HISTSIZE=10000
HISTFILESIZE=10000
HISTCONTROL=ignoredups
export HISTSIZE HISTFILESIZE HISTCONTROL
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
- エイリアスやコマンド補完
complete を使うと状況に応じて補完する対象を限定できる。たとえば、complete -d cd だと cd コマンドの 引数には、ファイルに cd することはあり得ないのでディレクトリのみ表示する、など。alias ll='ls -l'
alias la='ls -aF'
alias lla='ls -al'
alias top='nice -10 top -d 2'
complete -d cd
complete -u {su,finger,chown}
complete -c man
complete -A stopped -P '%' bg
complete -j -P '%' fg jobs disown
complete -c command type which
- PostgreSQL 用設定
ほとんどのユーザが DB を利用するので追加。PATH="$PATH":/usr/local/pgsql/bin
PG=/usr/local/pgsql
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":$PG/lib
export PGLIB=$PG/lib
export PGDATA=$PG/data
- wget 用 proxy 設定
export http_proxy=http://10.241.4.1:10241/
export ftp_proxy=http://10.241.4.1:10241/
export https_proxy=http://10.241.4.1:10241/
Linux kernel-2.4.19 からは 48bit LBA に対応した IDE ドライバが組み込まれている。よって、BIOS が対応しているかどうかは関係なく利用可能。ただし、BIOS が誤認識してしまったり、起動時にフリーズしてしまうならば、BIOS が HDD を認識しないように設定する必要があるかも。
たとえば、
・32GB Clip のジャンパで、BIOS に対しては 32GB のディスクとして振る舞わせる
・BIOS のドライブ自動検出を OFF にする。
もう一台 HDD を用意してそちらにシステムを入れ、137GB 超のディスクはデータ置き場としてのみ使う、というやり方なら簡単。この場合は カーネルが対応してさえすればいいので、137GB の壁を簡単に超えられる。
[vine-users:057577] Big Drive (137GB 以上)のHDD を使う
http://search.luky.org/vine-users.5/msg07572.html
200GB IDE HDD
http://tach.arege.net/d/20030125.html
i810で200GBのディスクを使用している実例。
137Gbytes 超 IDE ディスクの正しい使い方
http://www.atmarkit.co.jp/fpc/experiments/009over137hdd/
Linux 向けの内容ではないが、ハードウェアが対応しなくともドライバ次第で137GBを超えるディスクを使える、ということがわかる。
たとえば、
・32GB Clip のジャンパで、BIOS に対しては 32GB のディスクとして振る舞わせる
・BIOS のドライブ自動検出を OFF にする。
もう一台 HDD を用意してそちらにシステムを入れ、137GB 超のディスクはデータ置き場としてのみ使う、というやり方なら簡単。この場合は カーネルが対応してさえすればいいので、137GB の壁を簡単に超えられる。
[vine-users:057577] Big Drive (137GB 以上)のHDD を使う
http://search.luky.org/vine-users.5/msg07572.html
200GB IDE HDD
http://tach.arege.net/d/20030125.html
i810で200GBのディスクを使用している実例。
137Gbytes 超 IDE ディスクの正しい使い方
http://www.atmarkit.co.jp/fpc/experiments/009over137hdd/
Linux 向けの内容ではないが、ハードウェアが対応しなくともドライバ次第で137GBを超えるディスクを使える、ということがわかる。
問題: カレントディレクトリ以下には、複数個、複数階層のディレクトリがある。
その中にある特定の条件を持つファイルに grep をかけたい。
解答: find . |grep .0$ |xargs grep 'search string'
find でとりあえず全ファイルをリストアップし、grep で特定ファイルを絞り込む。
さらにそれを xargs に渡し、grep のコマンドラインを作って実行する。
このとき作成されるコマンドラインは、
その中にある特定の条件を持つファイルに grep をかけたい。
解答: find . |grep .0$ |xargs grep 'search string'
find でとりあえず全ファイルをリストアップし、grep で特定ファイルを絞り込む。
さらにそれを xargs に渡し、grep のコマンドラインを作って実行する。
このとき作成されるコマンドラインは、
grep 'search string' foo.0 bar.0 buzz.0といったものになる。
grep 'search string' foo.0; grep 'search string' bar.0; grep 'search string' buzz.0;とはならないため、複数のプロセスが大量に起動される、という事態を避けられる。
- 追記。
上記のような面倒なことをしなくとも、grep -r で再帰的に grep できる。パターンマッチのオプションをちょっとおさらい。
試した環境は TurboLinux 6.5 Server の perl version 5.005_03 built for i386-linux
perldoc perlre も参考になる。
かつ正規表現中に ^ や $ を使って先頭や末尾を指定しているとき。
それ以外の時は意味がないと思われる。
以下の例では、m を付けるとマッチ、付けないとアンマッチ。
普段は . は改行文字にはマッチしないが、s オプションによりマッチするようになる。
改行文字とは \n の事のようだ。\r は オプションの有無にかかわらずマッチした。
以下の例では、s を付けるとマッチ、付けないとアンマッチ。
s オプションにより、. は\n にマッチする。
以下のようなときは、m と s 両方のオプションを指定したときだけマッチする。
pattern という文字が続く。ただし、pattern は行の先頭でなければならないので、
pattern の直前は改行文字。」にマッチ。
こんなマッチをさせたい事って、あんまりないかな。
試した環境は TurboLinux 6.5 Server の perl version 5.005_03 built for i386-linux
perldoc perlre も参考になる。
- m オプション: $str を複数行として扱う。
m オプションを必要とするのは、文字列中に改行文字を含み、かつ正規表現中に ^ や $ を使って先頭や末尾を指定しているとき。
それ以外の時は意味がないと思われる。
以下の例では、m を付けるとマッチ、付けないとアンマッチ。
$str =~ "string\npattern\nptt\nend";
$str =~ /^pattern/m;
- s オプション: 文字列を単数行として扱う。・・・と書くとわかりにくいかな。
. を改行文字にもマッチさせるようになる。普段は . は改行文字にはマッチしないが、s オプションによりマッチするようになる。
改行文字とは \n の事のようだ。\r は オプションの有無にかかわらずマッチした。
以下の例では、s を付けるとマッチ、付けないとアンマッチ。
$str =~ "string\npattern\nptt\nend";
$str =~ /ring.*pattern/s;
- m オプションと s オプションを両方指定すると・・・?
m オプションにより、^ や $ の指定が有効になる。s オプションにより、. は\n にマッチする。
以下のようなときは、m と s 両方のオプションを指定したときだけマッチする。
$str =~ "string\npattern\nptt\nend";「ing という 文字列の後に、0個以上の文字列(改行も文字として扱う)が続き、
$str =~ /ing.*^pattern/ms
pattern という文字が続く。ただし、pattern は行の先頭でなければならないので、
pattern の直前は改行文字。」にマッチ。
こんなマッチをさせたい事って、あんまりないかな。
perl の join() のような処理をしてくれるストアドプロシージャを PL/PGSQL で作ってみた。ただ、カラム名をハードコーディングしなければならず、あまり使い勝手が良くない。ということで、以下のような質問を投げてみた。
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/php/1047317680/56
PostgreSQL 2テーブル目
http://pc2.2ch.net/test/read.cgi/php/1047317680/56
PL/PGSQL で Perl の join 関数みたいなストアドを作りたいんだけど、
なんかもっとスマートな方法無いでしょうか?
結果レコードのカラム名を変数で指定できると嬉しいんだけど、
Postgres 7.2.1 では変数展開してくれませんでした。
-- SQL の結果レコードに指定した文字列を挟んで連結して返す
-- 引数1: 実行する SQL 文
-- 引数2: 挟み込む文字列
DROP FUNCTION join_str(TEXT, TEXT);
CREATE FUNCTION join_str(TEXT, TEXT) RETURNS TEXT AS '
declare
delimiter alias for $1;
sql alias for $2;
str text;
rec record;
is_first bool;
begin
is_first = true;
str := '''';
FOR rec IN EXECUTE sql LOOP
IF is_first THEN
str := rec.serialnum; -- カラム名を指定
is_first := false;
ELSE
str := str || delimiter || rec.serialnum; -- カラム名を指定
END IF;
END LOOP;
return str;
end;
' LANGUAGE 'plpgsql';
とりあえずいろいろやってみる。
-X66 を記述してもしなくても同じだったので、とりあえず指定しないようにした。
http://pc.2ch.net/test/read.cgi/linux/1002445806/158 として投稿。
-X66 を記述してもしなくても同じだったので、とりあえず指定しないようにした。
http://pc.2ch.net/test/read.cgi/linux/1002445806/158 として投稿。
VP_IDE: VIA vt82c586b (rev 41) IDE UDMA33 controller on pci00:07.1
ide0: BM-DMA at 0xe000-0xe007, BIOS settings: hda:DMA, hdb:DMA
hda: ST38410A, ATA DISK drive
hda: 16841664 sectors (8623 MB) w/512KiB Cache, CHS=16708/16/63, UDMA(33)
# hdparm -i /dev/hda
/dev/hda:
Model=ST38410A, FwRev=3.03, SerialNo=6CS1JE84
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=512kB, MaxMultSect=32, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=16841664
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2 udma0 udma1 *udma2 udma3 udma4
AdvancedPM=yes: unknown setting WriteCache=enabled
Drive Supports : Reserved : ATA-1 ATA-2 ATA-3 ATA-4 ATA-5
# hdparm -m16 -c1 -u1 -d1 -tT /dev/hda
/dev/hda:
setting 32-bit I/O support flag to 1
setting multcount to 16
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
multcount = 16 (on)
I/O support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
Timing buffer-cache reads: 128 MB in 3.13 seconds = 40.89 MB/sec
Timing buffered disk reads: 64 MB in 5.31 seconds = 12.05 MB/sec
改訂第3版 PC UNIXユーザのためのPostgreSQL完全攻略ガイド、いわゆるシーラカンス本第3版 の35ページのコラム「1つのマシンで複数の PostgreSQL インストレーションを管理する方法」に書いてあった石井さんのやり方。この方法を使えば、異なるバージョンの postgres を同時起動したり、同じバージョンの複数の postgres を同時起動することができる。
ポイントは、ソースコード展開ディレクトリ、インストールディレクトリ、postmaster の待ち受けポートをすべて別にすること。インストールディレクトリや待ち受けポートは環境変数で指定できるの。この機能を利用して、異なる内容の .bashrc を用意しておいて必要に応じて source コマンドで環境変数を変えることで、異なる postgres を共存できるようにインストールし同時に起動することができる。
ちなみに、Postgres ではテーブルの集合をデータベースと呼び、データベースの集合をデータベースクラスタ、データベースインストレーション、インストレーションなどと呼ぶ。ちなみに MS SQL Server ではインスタンスと呼んでいた。
http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001Jun/msg000 ...
ポイントは、ソースコード展開ディレクトリ、インストールディレクトリ、postmaster の待ち受けポートをすべて別にすること。インストールディレクトリや待ち受けポートは環境変数で指定できるの。この機能を利用して、異なる内容の .bashrc を用意しておいて必要に応じて source コマンドで環境変数を変えることで、異なる postgres を共存できるようにインストールし同時に起動することができる。
PG=`pwd`
export PGPORT=10732
export PGLIB=$PG/lib
export PGDATA=$PG/data
export LD_LIBRARY_PATH=$PG/lib
PATH="$PG/bin":$PATH
ちなみに、Postgres ではテーブルの集合をデータベースと呼び、データベースの集合をデータベースクラスタ、データベースインストレーション、インストレーションなどと呼ぶ。ちなみに MS SQL Server ではインスタンスと呼んでいた。
- 参考
[pgsql-jp 21676] 異なるversion のPostgreSQL の使用http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2001Jun/msg000 ...
JM の mv より抜粋。
http://www.linux.or.jp/JM/html/gnumaniak/man1/mv.1.html
最後の引き数がすでに存在しているディレクトリならば、mv は指定したファイルを同じ名前でそのディレクトリに移動する。一方、2 つのファイルしか指定されない場合、 1 番目のファイル名を 2 番目のファイル名に変更する。
最後の引数がディレクトリでなく、 3 つ以上のファイルが指定された場合はエラーとなる。
したがって `mv /a/x/y /b' とすると、ディレクトリ /b がすでに存在する場合は /a/x/y を /b/y という名前に変更する。/b が存在しない場合は /b という名前に変更する。
ディレクトリを移動するとき、移動先が存在するかどうかでその動作が変わるのがポイント。
http://www.linux.or.jp/JM/html/gnumaniak/man1/mv.1.html
最後の引き数がすでに存在しているディレクトリならば、mv は指定したファイルを同じ名前でそのディレクトリに移動する。一方、2 つのファイルしか指定されない場合、 1 番目のファイル名を 2 番目のファイル名に変更する。
最後の引数がディレクトリでなく、 3 つ以上のファイルが指定された場合はエラーとなる。
したがって `mv /a/x/y /b' とすると、ディレクトリ /b がすでに存在する場合は /a/x/y を /b/y という名前に変更する。/b が存在しない場合は /b という名前に変更する。
ディレクトリを移動するとき、移動先が存在するかどうかでその動作が変わるのがポイント。
debian woody 3.0r1 をインストールしてみた。
jigdo を使って powerd.com から non-us パッケージをダウンロードし、
binary-1-NON-US を作成。
CD-ROM からブート。Kernel2.4 を使いたかったので、bf24 を指定。
bf24 では i82557 チップ搭載のネットワークカードは自動認識されなかったので、インストールが終わった後に手動で設定して認識させた。
jigdo を使って powerd.com から non-us パッケージをダウンロードし、
binary-1-NON-US を作成。
CD-ROM からブート。Kernel2.4 を使いたかったので、bf24 を指定。
bf24 では i82557 チップ搭載のネットワークカードは自動認識されなかったので、インストールが終わった後に手動で設定して認識させた。
df を実行し、閾値を超えていたらメールする perl スクリプト。
[linux-users: 20178] Disk Usage check script より。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/l ...
マシン台数が多ければ SNMP を使って集中的に管理するところだが、いまのところはこれで十分。
[linux-users: 20178] Disk Usage check script より。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/~poffice/mail/l ...
マシン台数が多ければ SNMP を使って集中的に管理するところだが、いまのところはこれで十分。
非常にまずい。間違って /dev/null を消してしまった。
以下の質問を 2ch.net に投げてみた。
http://pc.2ch.net/test/read.cgi/linux/1047096767/691
結局回答はもらえなかったが、問題なく動いているのでこれでいいのだろう。
追記。
JM の NULL のマニュアル
http://www.linux.or.jp/JM/html/LDP_man-pages/man4/null.4.htm ... によると、上記方法で良いみたい。
以下のようにすれば一行で書ける。
以下の質問を 2ch.net に投げてみた。
http://pc.2ch.net/test/read.cgi/linux/1047096767/691
間違って root で
# mv /tmp/log.txt > /dev/null
してしまい、/dev/null を上書きしてしまいました。
/usr/src/linux/Documentation/devices.txt を参考に、
# mknod /dev/null c 1 3
# chmod 666 /dev/null
として作成したのですが、これで良かったのでしょうか?
結局回答はもらえなかったが、問題なく動いているのでこれでいいのだろう。
追記。
JM の NULL のマニュアル
http://www.linux.or.jp/JM/html/LDP_man-pages/man4/null.4.htm ... によると、上記方法で良いみたい。
以下のようにすれば一行で書ける。
mknod -m 666 /dev/null c 1 3
システム設定ファイルを知ろう〜/etc/crontab〜
http://www.itmedia.co.jp/help/tips/linux/l0350.html
/etc/crontab が大本の設定ファイル。
http://www.itmedia.co.jp/help/tips/linux/l0350.html
/etc/crontab が大本の設定ファイル。
bash をカスタマイズして使いやすくする。
http://www.atmarkit.co.jp/flinux/rensai/theory09/theory09b.h ...
history の個数を設定するには、HISTFILESIZE と HISTSIZE を設定する。
- @IT の特集記事。
Windowsユーザーに教えるLinuxの常識 第9回 bashの便利な機能を使いこなそうhttp://www.atmarkit.co.jp/flinux/rensai/theory09/theory09b.h ...
history の個数を設定するには、HISTFILESIZE と HISTSIZE を設定する。
- 私好みのヒストリー設定
過去のコマンドを再利用しやすいように、history の件数は十分に確保する。HISTSIZE=100000
HISTFILESIZE=100000
HISTCONTROL=ignoredups