シェルコマンド

Latest Author koyumeishikoyumeishi /Date 2016-02-02 05:44:05 / Views 5395
3 (Favした一覧ページはユーザーページから)

競技プログラミングに役立ちそうなシェルコマンドについてのまとめ.
IDEを使っている人には縁がない話かも.

基本的なコマンド

pwd
現在ディレクトリのフルパス表示
cd
ホームディレクトリへ移動
cd [dir名]
指定ディレクトリへ移動
mkdir [dir名]
新規ディレクトリを作成
rm -r [dir名]
指定ディレクトリを中のファイルごと削除
cp -r [dirA] [dirB]
ディレクトリAをディレクトリBにコピー
mv [file名] [dir名]
ファイルをディレクトリへ移動
touch [file名]
新しいファイルを作成
diff [file名] [file名]
2つのファイルを比較する.
GCJとかでsmall用のプログラムを作った後にlarge用のプログラムを作った時,両者の出力が一致しているかどうか確かめる時とかに役立ちます。
ls
現在ディレクトリのファイル一覧表示
ls [dir名]
指定ディレクトリのファイル一覧表示
ls -a
隠しファイルも含む全てのファイル表示
ls -l
詳細情報を表示
ls -R
ディレクトリ下層までたどって表示
pushd [dir名]
現在ディレクトリをディレクトリスタックに積み、ディレクトリ移動
popd
ディレクトリスタック先頭のディレクトリへ移動して、スタックから降ろす
alias
コマンドの別名を指定する.例えば,筆者はalias g="g++ -Wall -Wextra -O2 -g -Wl,--stack=268435456 -D LOCAL -std=c++11"としているので, g A.cppと叩くだけでこれら全てのオプションが付く.この設定は.bashrcなどのファイルに書いておくと次回以降も有効になる.
aliasは単純な置き換えだが,もうちょっと複雑なことをしたく.bashrcfunction gin() { g++ $1 -O2 -Wl,--stack,104857600 && echo "compile done" && time ./a < in } と書いている変な人もいます.gin a.cppでコンパイルされ,コンパイルが成功すればファイルinの内容を標準入力として受け取りながらプログラムが走ります.
gdb
デバッガ.長くなるので省略します・・・(ググってください) コンパイル時に-gを付けておくといい.
valgrind
デバッガ.アクセス違反とかメモリリークとか未定義の変数にアクセスしてないかとかが全部わかるすごいツール.Windowsでは使えないらしい.コンパイル時に-gを付けておくといい.
factor [N]
Nを素因数分解する.競プロでは意外と便利.
time [COMMAND]
コマンドの実行にかかる時間を計測する

GCC

gcc, g++
GCCでC/C++言語プログラムをコンパイルする.以下は全てこれのオプション
-Wall -Wextra
警告を有効にする.例えば,gcc A.cpp -Wall -Wextraとコンパイルすると下のようなバグが検出される.
int main(){
    int a,b,c;
    scanf("%d",a);    // &aの間違い
    c = a+b;          // bが初期化されていない
}
コンパイラが古くて-Wextraがなければ,それの旧称であるところの-Wを使う.
-O2
最適化する.つまり,プログラムを解析して無駄を省いて高速化する.レベルは最低の-O0が無効で,最大で-O3まである
-o [出力ファイル名]
出力される実行ファイルのファイル名を指定する.-o A.cppなどとしてソースコード上書きしないように注意.
-D [MACRO]
マクロを定義する.例えばgcc A.cpp -D LOCAL -D X=10とコンパイルするとソースコードの先頭に#define LOCAL#define X 10としたのと一緒になる.これは次のような使い方ができる.
int main(){
    // ローカルではinput.txtから,ジャッジでは標準入力から受け取る.
    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
    #endif
    int arr[X]; // 配列の長さをコンパイルコマンドで指定できる
    int a,b;
    scanf("%d %d\n", &a, &b);
}
ちなみに,assert関数などは-D NDEBUGとすれば無効にできる.(参考)
-Wl,--stack=268435456
スタックメモリを256メガバイトにする.つまり,深い再帰呼び出しを行ってもスタックオーバーフローしづらくなる.この記法(コンマが入る位置とか)には環境によって若干違いがあるようです.ulimitコマンドで変える方法もある
-g
デバッグに必要な情報を埋め込む.gdbやvalgrindを使うときにこれがないと困る.
-std=[ver]
言語のバージョンを指定する.yukicoderではたぶん-std=c++11がついている.C++の新しい機能(ラムダとか)を使いたいときは必須.
-ftrapv
符号付き整数型の加減乗算でのオーバーフローを検知して abort する.

その他

A && B
コマンドAが正常終了した時に限ってコマンドBを実行する.例えばg++ A.cpp && ./a.outとすると,コンパイルが成功した場合にのみ実行される.
A || B
コマンドAが異常終了した時に限ってコマンドBを実行する.
A > output.txt
コマンドAの出力をoutput.txtに書き出す.
A < input.txt
コマンドAの入力をinput.txtから読み出す.
A | B
コマンドAの出力を入力としてコマンドBを実行する.例えば./generator.out | ./solver.outとすると,generator.outが生成するテストケースが./solver.outに入力される.