これは同僚との会話をメモしたものです。
Bashはどこでも使えるのか
ほとんど全てのUnix系にbashは入っているらしい。
スクリプトはとりあえずbashで書いておけばよさそう
補完はshellの仕様にあるのか
ない
ファイル終端の改行
POSIX的にはテキストファイルの最後は改行コードが必須。
vimとかだと行末には必ず改行がはいるけどEclipseとかだと最後に空行を入れないといけなかったりする。
実行フラグ
実行フラグをつけておくと、ターミナルのコマンドとして実行でき、またPATHの中から探してくれる。
もし $ bash my_script.sh と実行してよいのであれば実行フラグを立てておく必要はない。 . my_script.sh の場合もフラグは不要
bashrcが会社の設定と家の設定がごっちゃになって困る
bashrcから bashrc_localをロードすればいいよ
Mac のPATHの設定
PATH の初期値は /etc/paths にある
bashrcにinputrc的なことを書きたい
"\C-P": history-search-backward
"\C-N": history-search-forward
は
bind '"\C-P": history-search-backward'
bind '"\C-N": history-search-forward'
のようだ
Ctrl+Cした時にfinallyが動かない
Javaはそうらしい。
Rubyは動く
PowerShellはfinallyは動くけど、echoできなくなる
SIGTERMとSIGINTはなぜ分けたのか、使い分けることはあるのか
「less で F を押すと tail -f っぽい動作になるんだが、 ^C (sigint) で中断できる」とのこと
set -x した時のコマンドがわかりにくい
PS4変数を書き換える
set -x を取り消す
set +x
なおバッチファイルで言う @echo off の@は無いらしい。
zipコマンドでそのままのパスで圧縮されるのを避けたい
(cd target_dir && zip target_file)
子プロセスにすることでcdで戻ってこなくて良い
ワイルドカードが展開されない
ワイルドカードは見つかれば展開されるけど、見つからないとそのまま
cp *.html *.js *css target_dir
ってやると .js がひとつもないときに "*.js"という名前が渡されるのが困る。
コピーに失敗するとリターンコードが0ではなくなるので。
findを使えばよい
find . -name '*.html' -o -name '*.js' -exec cp {} target_dir \;
スクリプトのディレクトリがほしい
script_root=$(cd `dirname $0` && pwd)
パラメタをファイルに書いておく
args.txtはスペース区切りではなく、改行区切りでも普通にうまくいく
$ cmd $(cat args.txt)