- シェル変数と環境変数の違い
- シェル変数は子プロセスには伝わらない。環境変数は子プロセスにも伝わる。
- シェル変数も環境変数もman 3 getenvで取得できる。
- configureやmakeに変数を渡すパターン
- CC=hogecc ./configure.sh
この場合、configure.shスクリプトにはCC=hogeccは伝わり、configure.shスクリプトが書き出すMakefileにCC=hogeccが反映される。
- make CC=hogecc
この場合、makeコマンドにCC=hogeccは引数として伝わり、makeの内容に反映される(makeコマンドが、aaa=bbb形式の引数は、ソレっぽく解釈して設定してくれる)。
- ./configure.sh CC=hogecc
この場合、configure.shスクリプトはエラーを出す(CC=hogeccは引数として伝わるが、configure.shはaaa=bbb形式の引数をソレっぽく解釈してくれない)。
- CC=hogecc make
この場合、makeコマンドにはCC=hogeccは変数として伝わっている筈だが、反映されない(Makefileの設定の方が優先されている為?要調査)。
- #!/usr/bin/env を使ってスクリプトを起動する場合、コマンドに引数を指定できない(残り全体がコマンド文字列だと解釈される)。
- configureスクリプト、Makefileのオプション
- ps -auxww | grep hoge_command | grep -v grep
- は、以下のように書ける。
- ps -auxww | grep '[h]oge_command'
- 高機能なシェルを使っている場合、シェルが[]を解釈してしまわないように注意する必要がある。
- 「2>&1」の位置
- can_error_command >> all_log 2>&1
- コレは期待したとおりに動く(STDERRに出力された内容もall_logに記録される)。
- can_error_command 2>&1 >> all_log
- コレは期待したとおりに動かない(STDERRに出力された内容はall_logに記録されず、「コマンド実行時のSTDOUT」に出力されてしまう)。
- 要するに、「2>&1」とは、「1の中にあるポインタ自体を、2にもコピーする」という事だと解釈(矢印の向きに騙されるな)。
- reiserfsck
- 実行するには、umount状態か、readonlyでのみmountされている必要がある。
- rwでmountされている場合は、実行できない。
- xargs
- echo 1 2 3 4 5 | xargs echo
- このように展開される↓
echo 1 2 3 4 5
- echo 1 2 3 4 5 | xargs -n 1 echo
- nice
- 実働中システムの中で、重いコマンド(makeとか)を実行するなら、コレを頭につけるのは基本中の基本。
- .bashrc, .bash_login, .bash_logout
- .bashrcは、bash(/bin/shも?不明…‥)を使う時、常に実行される。ココに余計なコマンド等を書いてしまうと、scp等が動かなくなる可能性がある。
- .bash_loginは、インタラクティブなログイン時(要するにttyっぽいモノ経由でのログイン時)にのみ実行される。人間がシェルを使う時に実行したいコマンドはココに書く。
- .bash_logoutは、インタラクティブなログイン終了時に実行される。
- ssh-agent等のkillは、ココで行うようにする。
- redhat系だと、面倒な事に、デフォルトとして、ココにclear等が記述されている。不便なので消す。
- gdbの極簡単な使い方
- 予め、デバッグしたい対象をコンパイルする時に-gオプションをつけておく。また、make時に実行バイナリがstripされてしまわないように注意する。
- ulimit -c unlimited で、coreを吐くようにしておく
- デバッグしたい対象を適当に実行。
- デバッグしたい対象がcoreを吐いたら、
gdb デバッグしたい実行ファイル coreファイル
- 日本語テキストファイルをutf8←→euc変換したいが、nkf最新版が無い時
- lvで現在表示中の文書の文字コードを変更する
- lessで現在表示中の文書の文字コードを変更する
echo -e '#!/bin/sh\nls --show-control-chars "$@"' > ~/bin/l && chmod a+x ~/bin/l
- 端末エミュレータの文字コードセットと、ファイル名の文字コードセットが一致またはcompatibleである事。
- jisとeucは一応compatibleであるっぽい気がする…‥(ちゃんとは調べてない)
- ファイル名がsjisという事=ゲイツosのディスクをmount、だと思うので、mount時のオプションで、ファイル名をeucに変換するようにしておく。具体的には
mount -t ntfs -o iocharset=euc-jp,codepage=sjis /dev/hoge /mnt/win
- 但し、カーネルにソレ系のモジュール(nls_cp932とかnls_euc-jpとか)が入っている事。
- zshのファイル名補完機能でも、--show-control-chars相当になる。
- info
- --vi-keysで、emacsベースではなく、vi/lessベースの操作体系になる。
echo -e '#!/bin/sh\ninfo --vi-keys "$@"' > ~/bin/i && chmod a+x ~/bin/i
- gnu tar
- bzip2オプションはディストリビューションによってまちまち。大抵はyかjかI。
- gzipかbzip2オプションが指定された時、tarの内部でgzipやbzip2がパイプ起動されて、それによって圧縮される。
- スクリプト化したり、標準入出力等を別用途で使っている場合は、上記実装によってSIGPIPEがコッソリ起こる場合有り。ちょっと注意。
$ printf "%08x\n" 123
0000007b
- 沢山のファイル/ディレクトリツリーの中から、grepで特定単語を探す
grep 調べたいものの名前または正規表現 `find` 2>/dev/null | nkf | more
- ファイルがあまりにも大量の場合はシェルに拒否されるが、諦める(bashだと拒否されやすく、zshだと拒否されにくい気がする)
- 多分、もっとスマートな方法があるのだろうが…‥。
- grep -rはどうでしょう? - kou
- うわ、こんな楽なオプションが…‥どうもありがとうございます。
- という訳で、以下のようになりました。
grep -r 調べたいものの名前または正規表現 調べたいディレクトリ | nkf | more
- 但し、grepのバージョンがあまりにも古いと、このオプションが無い事もあるっぽい…‥。
最終更新 : 2005/01/13 15:23:16 JST