シェルコマンド
Latest Author koyumeishi /Date 2016-02-02 05:44:05 / Views 5426
競技プログラミングに役立ちそうなシェルコマンドについてのまとめ.
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は単純な置き換えだが,もうちょっと複雑なことをしたく.bashrc
にfunction 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に入力される.