morimorihoge です。最近はやりたいゲームができても暑くて全ての気力が削がれてしまい、頑張れてないです。湿気ほんとつらい。
さて、いつものようにはてブを眺めていたら、Qiitaの LinuxCUI初心者が早く知りたかったコマンド(操作も) という記事にちょいちょいネガティブブコメがついており、その中に ブコメの人たち、高いレベルのものや綺麗にまとまったものが読みたかったら君たちがその記事を書けばいいんじゃないかな。この記事はタイトルどおりだと思うよ。Ctrl+Uが書いてあるだけでも助かる人はいる。 というコメントがあって確かにその通りだなあと思ったので、少し元記事に欠けてるなーと思った部分を補完しつつまとめてみます。
- ※2017/07/31 12:30 ブコメで頂いた情報を反映しました(コマンド編)
前提
恐らくこの記事はRedHat系ディストリビューション(RHEL, CentOS, Fedoraなど)にバンドルされていてユーザーのデフォルトシェルである Bash 環境を前提としています(bash_historyの話とかあるので)ので、そう思って読みましょう。 ll
のaliasなんかはディストリビューションによっては存在しないケースもあります(その場合の設定方法も補足します)。
他のシェルを使っている人でも、Bashとほぼ互換を保っているzshなんかであれば概ね同じですが、設定ファイルのパスなど細部に違いがある可能性がありますので自分の環境に合わせて読みましょう。
キーボード操作編
補完機能
Tab連打によるファイル名補完機能は本当に大事です。僕は大学の非常勤講師なんかもやっているのですが、特に初心者であればあるほどタイプミスなどでコマンドエラーを出して嫌になってしまう学生を多数見てきたので、とにかく最初にTabキーから教えています。
Tabキーでの候補は数が多すぎると閲覧しきれないので、1文字でもいいから探しているファイルやコマンドの頭文字を入れてTabするのがコツです。
また、カレントディレクトリのファイルパスを検索したいのにコマンド一覧が出てしまうと言う人は、 ./
の後にTabキーを押すとコマンド候補ではなくファイル一覧候補を出すことができます。
入力間違いでもBackspaceやDeleteできない
そもそもこれ(^H^H^Hや^[[3~、^[[Dが表示されて涙目
)はターミナルクライアントの設定がおかしいケースで発生します。一回だけ使う環境であれば我慢して使うのでもいいかもしれませんが、ある程度利用し続ける環境であればまずクライアントソフトの設定を見直しましょう。
Consistent BackSpace and Delete Configuration 辺りを見ると、Bashであればinputrcの設定とクライアントソフトの設定がかみ合っていない可能性が高いですね。
#なお僕の経験則ですが、BSキーが効かない場合、Ctrl-H
でバックスペースできる場合がありますので、とりあえずどうにかしたいときには試してみるといいかも
また、 Ctrl-U
はプロンプトの全消し以外に パスワード入力中の内容をリセットすることもできます。 sudoのパスワードプロンプトで入力ミスったときは適当にEnterすると間違ったパスワードを入力したログがauditに残るので、Enterする前であれば Ctrl-U
して打ち直しするのがスマートです。
入力履歴検索
↑キー以外にCtrl-R
でhistoryからインクリメンタル検索できますが、インクリメンタル検索の次候補が出したければさらにCtrl-R
を押していくと過去のコマンド履歴に戻っていくことができます。
また、カーソルキーが前節のようにバグって表示されてしまう環境の場合、↑キーは Ctrl-P
(Previous)、↓キーはCtrl-N
(Next)で代用できます。同様に→キーはCtrl-F
(Forward)、←キーはCtrl-B
(Back)で代替できます。
この辺り、Bashの文字操作系キーはEmacsっぽいキーバインドになっているものが多いので、Emacs使いであれば覚えやすいかもしれませんね。
Ctrl + Z
Ctrl-Z
はフォアグラウンドプロセスを一時停止してしまうので、仮想デスクトップ切り替えとは全然異なります。
実行中のプログラムをバックグラウンドにもっていく。フォアグラウンドにもってくる(bg、fg) 辺りの記事を参照された方が良いでしょう。
仮想デスクトップ切り替え的なことがしたければ、tmuxやscreenを使えばまさにそれっぽいことができます。
その他
Emacsっぽいキーバインドが使えるので、他にはCtrl-A
で行頭移動、Ctrl-E
で行末移動、Ctrl-K
でカーソル位置から末尾までの行を切り取りし、 Ctrl-Y
でペーストすることができます。
このコピー情報はシェルの中に保持されているので、
- 目的のコマンド(長い)を打っている途中に「あ、そもそも先にこれやらなきゃ」という作業に気づく
Ctrl-A
(行頭移動),Ctrl-K
(カーソル行から末尾まで切り取り)して入力中のコマンドをコピーしつつプロンプトをクリア- やり忘れた作業をする
Ctrl-Y
(ペースト)で入力中だった長いコマンドを復帰
ということができます。
また、初心者だと割とやりがちなのは、 Ctrl-S
(stop)でしょうか。これを間違って押してしまうとその瞬間から突然ターミナルへの入力が受け付けられなくなります。画面は特に変化がないので「フリーズしたかな?」と思うかもしれませんが、Ctrl-Q
を押せば解除されます。
これも存在を知らないとハマってしまう奴ですね。
用語・概念編
バッシュって何?
Linuxの機能はkernelが提供しているのですが、kernelはそのままだとシステムコールというOS機能を受け付ける入り口しかなく、システムコールはプログラムから実行することしかできないためそのままでは人間が機能を利用することができません。
そこで、kernelへのアクセスを仲立ちしてくれるプログラムとしてshell(シェル)があります(kernel:核に対するshell:殻)。
shellという言葉は概念的なソフトウェアの役割を指す(エディタ、みたいなもの)ので、実際には様々な実装(具体的なソフトウェア)としてbash, dash, tcsh, zsh, fishなどがあります(Emacs, Vimみたいなもん)。
コマンド入力の記法については実装に依存するのですが、現行のメジャーなLinuxディストリビューションではbashまたはbash互換のシェルが主に採用されていますので、特にこだわりがなければまずはBash記法を勉強するのが良いでしょう。
Bash記法はLinuxの起動ファイル群でも使われているので、Bash記法を覚えればOSの挙動を深く追いかけていくことができるようにもなります。
シェルスクリプト
特に元記事におかしな点はないので良いと思います。シェルスクリプトを書き始めると test
コマンドの存在を知ることができ、より*NIX的な「単機能のコマンドを組み合わせてやりたいことを実現する」という世界が見えてきて楽しくなると思います。
/etcや/dev
Windowsフォルダには設定ファイル以外にDLLファイルなども入っているので、/etcがWindowsフォルダというのはちょっと乱暴かなと思います。LinuxとWindowsはそもそも違うOSなので、設計思想が異なる部分を「XXはYY」という形で紐付けて覚えてしまうのは雑な説明としてはともかく、それで覚えてしまうと危険です(/etcにプログラムインストールしたりとか)。
/devや/sys、/procもそうですが、LinuxはWindowsと違ってほとんどのリソースをファイルアクセスで抽象化するのが特徴なので、そういった部分に着目してOSの勉強などをすると良いのではないかと思いました。
/procの下を探検して自分だけのオリジナル ps
コマンドを作ってみたりするのは良い修行だと思います。
pid?
ここで言われているのは実行中プロセスのプロセスIDのことではなく、一部のバックグラウンド起動ソフトウェアが使うpidファイルのことのようですね。
pidファイルは大抵の場合中にプロセスIDが記載されたファイルで、二重起動して欲しくないプログラムの二重実行防止や停止処理のために使われます。
プログラム実行時にプロセスIDをpidファイルに保存しておくことで、プログラム停止時に間違いなくそのプロセスを停止させることができるのですね。pidファイルがない場合プログラム名で絞り込むということはできますが、もし同じ名前のプログラムが動作していた場合にどれを停止すれば良いのか分からなくなってしまいます。
こういう時のためにpidファイルが必要なのですね。
#ただ、想定外のシャットダウン等で再起動後にもpidファイルが残っていると、pidファイルを消すまで起動できなくなるといったデメリットも存在します
ソケット SOCK SOCKET
元記事の内容で特に問題ないと思います。プロセス間で通信をする方法にはシグナル、パイプ、ソケット、mmapなどがありますのでそれぞれ知っていると理解が深まると思います。
ソケットは主に1対多プロセス間で通信するときに使われますね。
$
シェル変数の話ですね。特にシェルスクリプトを書く時に必要になります。
僕はいちいち覚えてないのでその都度検索しています。
コマンド編
ll
実際に使う側としての理解として ls -l と同じ
というのは間違いではないですが、Linuxコマンド的に ll
というコマンドはありません。alias
という機能を用いて引数付きコマンドに別名を付けることで実現されています。
定義済みaliasは alias
コマンドで一覧できます。
例えば、僕の手元だと、
ll='ls -lh'
ls='ls -G'
となっているので、 ll
の実体は ls -G -lh
になります。
初期設定時に定義済みのaliasはディストリビューションによって異なりますので、ll
がない環境も存在します。特に、rootのシェルでは本当に最小限の設定しか書かれていないケースがあるので、ll
はls -l
へのaliasであることを知っておくことはそれなりに大事です。
ll
のaliasがデフォルト設定されていない環境でll
を使いたい人は、自分の ~/.bashrc
あたりに
alias ll='ls -lh'
と書けば使えるようになります(=
の前後にスペースを空けてはいけません)
なお、上記の様にls
自体がaliasされてしまっている時に素のlsコマンドはどうやって使うの?という問いには /bin/ls
とコマンドの絶対パスで打つことで解決できます。
シェルスクリプトなんかでよく冒頭にコマンドの絶対パスを変数に入れてそれを使うようにしているのは、想定外のalias挙動によって動きがおかしくならないための先人の知恵なのかもしれませんね。
2017/07/31 12:30 追記
ブコメにて id:itouhiro さんより、素のコマンドを使いたい場合には先頭にbackslash()を入れることでも実現できると指摘を頂きました。
改めて調べてみると、この辺の記事にまとまっていました。
以下の方法で素のコマンドを実行できるようです。
- バックスラッシュ記法:
\ls
- シェルコマンド
command
を使う:command ls
- 絶対パスまたは相対パスを使う:
/bin/ls
やcd /bin;./ls
- コマンド名をクオートで囲む:
'ls'
、"ls"
参考になりました。ご指摘ありがとうございました。
less
昔はmoreというコマンドがあってだな・・・というオッサンの昔話はいいとして、ファイル閲覧はlessで良いと思います。
人によってはvim -R
を使う人もいるようですが、lessは大抵デフォルトでインストールされているのが良い所ですね。
cat awk sed cut sort wc
前項にも書いた通り、Linuxらしい「単機能を組み合わせてやりたいことを実現する」道具たちです。知らなくてもなんとかできるケースはありますが、知っているとすごくシンプルにものごとを解決できたりします。
find
findはファイルを探すというので間違いないのですが、非常に強力なオプションを多数備えているのでぜひman find
してみると良いでしょう。トラブルシューティングの際に「N日以内に更新されている(されていない)ファイル」なんかもこれで検索できます。
ps
元記事通りで良いと思います。
top
標準パッケージではないので追加インストールが必要ですが、多少リッチに見たいときにはhtop
なんかも便利です。
curl
curlはただのHTTPクライアントとしての機能だけでなく、相当多機能でポテンシャルを秘めています。
とりあえず手元のcurlのmanを見るだけでもDICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP
などなど多数のプロトコルに対応しているので、対応していることだけでも知っておくと便利だと思います。
which
元記事の通りの理解で問題ないと思います。複数の同じ名前のコマンドがインストールされている環境(rubyとかpythonなど)の場合、どちらが動いているかを確認する手段としても有用ですね。
ip a
もう最近ifconfig
は使わない世界になっていっているようなので、ipコマンドで覚えるのが良いでしょう。ifconfigで書かれているかどうかで記事の鮮度を確認するのにも使えるかもしれないです。
yes
地味にCPUを1コア100%使用率にするのにお手軽便利だったりします。さすがにconsoleに出すとうざいのでyes > /dev/null
とかで。
まとめ
というわけで、勝手に色々補足してみました。
他にも書きたいことはちょいちょいありますが(tmux/screen使おうとか)、全部書くのは気力的にも文章量的にもつらいので、元記事に対応する形でまとめてみました。
Linux界隈は昔からの積み重ねで現状があるので、新規参入してくる人達にとってはどんどん覚えないといけないことが増えていて勉強が大変だなあと思います。
ただ、その分一度覚えたことが陳腐化する速度はゆっくり目なので、覚える価値もその分あるのではないかと思いました。
ではでは。こちらからは以上です。僕も10年以上Linux使ってるとはいえまだまだ世の中には大先輩がいらっしゃるので、指摘等ありましたらブコメ、Twitter(@morimorihoge)等で :masakari: して頂ければと思います。