2023/01/06
sponsored link
目次
Linuxを使う必要性
管理人はNWエンジニアとしてあるSSHやファイル転送等である程度はなれていましたけど、それでもGUIツールを使う事が多かったです。プログラマーになるとGUIツールでノロノロやることが許されなくなります。デバッグ時のDBでの出力結果が、ギガバイト単位だとそもそもローカルに持ってこれないですし、エディタで開けません。参照はhead,tail,lessで一瞬です。重複レコード検出もuniq -d | wc -lで一発です。
またGuiツールですとBash等でのスクリプトで効率化できません。そのためCUIベースにて習得しましょう。
・作業効率が段違い。ls a* でaで始まる一覧を取得できる
→ツールだとフィルターを選択して一つ一つクリックする羽目になる
・プログラム連携がしやすい。標準入力を中心としてるので|で接続することで複雑な処理を簡単に実行できる
→cat a.txt | grep “foo” でa.txtからfooを含んだ行のみ抽出ができる。
・自動化がしやすい
→先のcat a.txt | grep “foo” 等のコマンド郡をまとめたスクリプトにすることで正確な自動化が可能
Linuxを習得できる環境の用意
一昔前なら以下を用意する方法が考えられました。
・cygwinをインストールする
・古いパソコンにlinuxをインストール
・VMWARE PLAYER
最近の流行りですと以下のどれかがおすすめです。
・WSLのインストール (Windows Subsystem for Linux)
・DockerをインストールしてLinuxイメージをマウントする
・Git for Windowsに付属しているGit bashを使う
WSLとDockerは最新の仮想化技術です。とても速くて快適ですよ。dockerを覚えなくて良い分WSLのほうがいいですね。OSは今の所Ubuntuが流行ってて習得しやすいです。WSLはインストールも驚くほど簡単です。Git bashも手軽でよいですが、本格的なLinuxに比べてかなり制限が多いのでWSLにてUbuntu覚えたほうがよいと思います。
カーネルやシェルとはなにか?なぜ分かれているのか
・カーネルとはハードウェアを管理し、処理も実行も行うもの
・シェルとはユーザーからの操作を受け付けてカーネルへの橋渡しを行うもの
分離させることにより以下を可能としている
・カーネルには手を入れずに、シェルだけを好みのものに変更が可能となる
・シェルが高負荷などの理由でクラッシュが起きても、カーネルへの影響を分離し被害を最小限に抑える
シェルの種類
sh もう使われない廃れたシェル。
csh もう使われない廃れたシェル。Cシェル系と呼ばれ、文法がshと大きく異なる。後継にtcshがある
tcsh FreeBSDのログインシェルに採用。Cシェル系は便利機能が多いがシェルスクリプトには向かない
bash shと後方互換性を持つ。多くのLinuxのログインシェルに採用。シェルスクリプトを書くのに最適
zsh bashやtcshの機能を取り込み、独自の拡張を加えた新しいシェル。上級者向けのシェル
fish 新しいシェル。デフォルトで強力なタブ補完がついています。
実務での習得用にはbashがいいです。最近だとfishも人気のようですね。本番サーバーとかにはインストールされていないと思うので、開発は遅くなりそうですが、普段からbashでなれたほうがメリットはあるかもしれません。シェルはインストール後、bashやshと入力しただけで簡単に切り替えが可能です。
各ディレクトリの役割
/bin システムの動作に最低限必要な重要度の高い実行ファイルが格納されているディレクトリ
/deb デバイスファイルが格納されているディレクトリ
/etc 設定ファイルが格納されているディレクトリ
/home ユーザー毎に割り当てられるユーザー名のホームディレクトリ
/sbin 管理者ユーザー向けの実行ファイルが格納されているディレクトリ
/tmp 一時的なファイル置き場
/usr 追加でアプリをインストールした際に付随するファイル置き場。rootディレクトリと構造が似た形態を取る
/var ログやメール等の変化(variable)するデータ置き場
エイリアス
alias,unaliasでコマンドに別名をつけることが可能
typeコマンドでそのコマンドがエイリアスを使われてるか識別が可能
bashのオプション
setコマンド +oでオフ、-oでオン。設定下記のshoptで設定するものとは別系統
shoptコマンド -sでオン、-uでオフ。setよりも新しく項目も多数持つ
プロンプトの変更
PS1変数に代入することで変更することが可能
\d 日付:曜日 月 日
\H ホスト名
\h ホスト名最初の.までだけ
\n 改行
\t 時刻:HH:MM:SS
\u ユーザ名
\w カレントディレクトリ
\W カレントディレクトリの末尾のみ
\$ rootは#、それ以外は$
\\ \そのもの
bashの設定ファイル
設定コマンドを入力しただけでは、ログアウトするとリセットされてしまうため、設定を永続化させるために.bashrcファイルに記入しておき、bash起動時に読み込ませる必要がある
bash起動時に以下3ファイルが順番に読み込まれる。
/etc/profile システム全体で利用されるファイル。全ユーザー共通の場合はここでもよい
~/.bash_profile ユーザー個別 ログイン時に一度だけ読み込まれる
~/.bashrc ユーザー個別 bash起動するたびに読み込まれる。基本はここに書く
.inputrc に以下を追記
cdとかでtabキーを押すとディレクトリ等が補完が効くのですが、大文字小文字は判定されてしまいますので不便です。その解消法は.inputrcというファイルをホームディレクトリに作成し中に以下一行を書くと有効になります。.inputrcはubuntuにはデフォルトでは存在しないのでtouchコマンドで作りましょう
#補完時に小文字大文字を区別しない
set completion-ignore-case on
# ファイルタイプに色をつける
set colored-stats on
# 補完の接頭辞に色をつける
set colored-completion-prefix on
プロセスとジョブ
プロセス
・Linuxからみた処理の単位
ジョブ
・シェルからみた処理の単位。
3つのコマンドをパイプで繋ぐと3プロセス、しかしジョブの場合、1行1ジョブという単位で扱われる。ジョブを使いこなせば、バックグラウンド処理などができる。
ジョブには3つの状態がある
フォアグラウンド・・処理が実行されている状態。対話で操作をする
バックグラウンド・・処理が実行されている状態。対話で操作をしない
停止・・処理を一時的に中断している状態。
「ctrl+z」は「停止」状態になる。終了とは別でした。なので再開が可能。(ただしcp(コピー)コマンド等は中断されているためいつまでも終わらない。)
「ctrl+c」が本当に「終了」です。
「jobs」コマンドでjobリストと番号を取得が可能。+が一つと-があるが+がカレントジョブ
「fg %<ジョブ番号>」で「フォアグラウンド」状態にする(元通り)。ジョブ番号を省略するとカレントジョブにできる
「bg %<ジョブ番号>」ジョブ番号を省略するとカレントジョブを指定したことになる。(cpコマンドをバックグラウンドで再開できる)
これによりvimで編集中に途中でヘルプを確認したりなどが可能。
最初からバックグラウンドで処理させたい場合は末尾に「&」をつけることで可能。
cp a.zip a.zip_bk &
「kill %<ジョブID>」でバックグラウンドのジョブを終了します。
ただし、端末を閉じるとバックグラウンドのものも終了してしまうため、実務では「nohup cp azip a.zip_bk &」を使います。
強制終了は「kill -KILL プロセスID」