自分の中では普通だったけど、ビックリされたコマンド達やツールの知識のメモ

相手の知らないLinuxコマンドを打つとビックリされる
=====

自分の中では普通の知識になってたけど、その知識が無い人が自分がコマンド打つのを見ると

「え、そのコマンド達はどこで覚えたん？」
とか
「その知識はいつ習得したん？」

ってビックリされながら言われる．もはやお約束レベルで言われる．

自分の常用するPCにUbuntu突っ込んで使っていたり、
VPSサーバーとか契約して色々試している時に分からないから調べて、何回か使う内に覚えた程度の事だけど
世間一般ではサーバーを建てる方が少数派で、こういうコマンドとか知識はあまり無いのが一般的なんだろな．
ましてやLinuxをメインのPCとして使うのもマレなんだろう．まぁMacも使ってはいるけど．

**つまりは...**

自分があたり前と思っていても、普通は基本知らない
=====
って時も往々にしてある．って事だ．
そして多分Qiitaのユーザーでも「へぇ〜、そういうコマンドがあるんか！」と言う人は少なくないと思う．

...Qiitaを使う人の中で、どれだけの人がLinuxのコマンドや知識を持ってるのやか...気になる...
Qiitaだけでなく、GitHubを使っている人は、どれだけLinuxのコマンドやツールの知識があるのだろう...

話が逸れた．

**何が言いたいかと言うと**

ビックリされたコマンドを公開していけば結構色々な人の助けになるかも？
=====
って事．

なんで色々とメモしていきます
=====
まぁどんどん増えていくだろうから、増えたらどんどん別の記事として書いていこうかな．
大体1つの記事に10〜15コマンドを目安として考えてます．
あと，ここでは「詳しい使い方」というよりはビックリされたツールやコマンドのオプションとかについてツラツラと書いていくつもりなので，詳しい説明はまた別の機会に．
何か「これ説明してくれ！」とかあったらコメントお願いします．

ちなみに "Bash" ベースの話です
=====
tcsh とか zsh を使ってるとまたちょっと違うかも

ってことで ビックリメモその1
=====

man
-----
man コマンドは Linux コマンドに関する使い方を表示してくれるコマンド．
これは学校の授業で学んだ．Google先生に頼る事も多いけど、基本的なコマンドの確認ならmanコマンドもよく使う．
(とか書いた後に調べたら 6 回しか使ってなかった...)
似たようなコマンドに "info" ってコマンドもあったりするけど、 "man" コマンドの方
ちなみに man は "MANual" の略．読み方は普通に 「マン」．
何も考えずに「マンコマンド」って言ったら「マンコマンドってwww おまww あぶないなww」って言われたけど、
やましい気持は一切ありませんはい．そんなのやましいとか言うやつがやm...いえ、なんでも無いですはい.

使い方は簡単で、例えば man コマンドの man を見たければ

```shell-session
$ man man
MAN(1)                                                       Manual pager utils                                                       MAN(1)



NAME
       man - an interface to the on-line reference manuals

SYNOPSIS
       man  [-C  file]  [-d]  [-D]  [--warnings[=warnings]]  [-R  encoding] [-L locale] [-m system[,...]] [-M path] [-S list] [-e extension]
       [-i|-I] [--regex|--wildcard] [--names-only] [-a] [-u] [--no-subpages] [-P pager] [-r prompt] [-7]  [-E  encoding]  [--no-hyphenation]
       [--no-justification] [-p string] [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] [[section] page ...] ...
       man -k [apropos options] regexp ...
       man -K [-w|-W] [-S list] [-i|-I] [--regex] [section] term ...
       man -f [whatis options] page ...
       man  -l  [-C  file] [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-P pager] [-r prompt] [-7] [-E encoding] [-p string]
       [-t] [-T[device]] [-H[browser]] [-X[dpi]] [-Z] file ...
       man -w|-W [-C file] [-d] [-D] page ...
       man -c [-C file] [-d] [-D] page ...
       man [-?V]

DESCRIPTION
       man is the system's manual pager. Each page argument given to man is normally the name of a program, utility or function.  The manual
       page  associated  with  each  of these arguments is then found and displayed. A section, if provided, will direct man to look only in
       that section of the manual.  The default action is to search in all of the available sections following a pre-defined order ("1 n l 8
       3  2 3posix 3pm 3perl 5 4 9 6 7" by default, unless overridden by the SECTION directive in /etc/manpath.config), and to show only the
       first page found, even if page exists in several sections.
```
みたいな感じで説明文が表示される．この後に Option の説明とかが来る．
説明文が詳しく書いてあるか否かは「開発者がどこまで man コマンドを丁寧に書いてくれているか」によるので、あまり為になる情報が無い場合もあるけど，昔からあるコマンドに関しては結構丁寧に書いてあるので、一度覗くと言いかも．

ちなみにこのサンプルは英語だけど、環境設定によっては日本語で表示される．

### -a option

コメントを頂いたので引用

> manコマンドについては-aオプションも便利ですね。
> 環境に依存せず、全てのマニュアルページを表示（それこそ和英からPOSIXベースまで）してくれます。

との事．
全てのマニュアルページと言われてもピンと来ないかもしれないけど，man には「セクション」という考え方があり，同じ名前で複数のマニュアルが存在する場合がある．その全てが表示されるという事だ． "-a" は "all" という意味だと思う．

> ネックとしては閉じたい時にq連打しないといけないことでしょうか。
> これについても綺麗な抜け方を知ってる人が居るかもしれませんけど。

と書かれていたけど，自分のPCで試したところ，

```bash
da0shi@qiita [~]$ man -a man                              
--Man-- 次は: man(1) [ 閲覧 (return) | スキップ (Ctrl-D) | 終了 (Ctrl-C) ]

--Man-- 次は: man(7) [ 閲覧 (return) | スキップ (Ctrl-D) | 終了 (Ctrl-C) ]
<Ctrl-C>
da0shi@qiita [~]$ 
```
と丁寧な誘導が出てきた．

man のバージョンやOS (MacOSX と Linux系 では結構違う事がある) によって違うのかもしれない．
あとでMacでも試してみます．

ちなみにバージョンとOSの情報は以下の通り

```bash
da0shi@qiita [~]$ man --version
man 2.6.7.1
da0shi@qiita [~]$ cat /etc/lsb-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=17
DISTRIB_CODENAME=qiana
DISTRIB_DESCRIPTION="Linux Mint 17 Qiana"

```


scp
-----
scp ってのは

> The SCP Foundation
> Secure, Contain, Protect

という団体によって保護、管理、研究されている所謂 UMA の総称．
団体のホームページ: http://www.scp-wiki.net

...ってのがGoogle検索のトップに来たけど、それとは全く関係無くて

「リモート上のコンピューターとのファイルのやりとり」を行なうためのコマンド．
man コマンドで確認すると名前の所に

```bash
$ man scp
...略...
NAME
     scp — secure copy (remote file copy program)
...略...
```
とある．"ssh" と呼ばれる通信方式を採用する事によって、セキュリティ的に強化されているので "Secure" と名前が付いているとの事．
Wikipedia曰く
「元々は rcp (Remote CoPy) と呼ばれるコマンドをセキュリティ的に強化したバージョンのツールで、使い方は rcp とほぼ同様」
との事．まぁ rcp 自体今ではあまり見かけないのでピンと来ないと思う．自分は "cp" コマンドと大体同じ感覚で使っている．

基本的な使い方は cp コマンドと同じように

```bash
$ scp {コピー元} {コピー先}
```

とする事でファイルのやりとりをする．
ただし、リモートのサーバーとファイルをやり取りする際には指定されたフォーマットに沿って書かないとやりとりができない．
そのフォーマットは以下の通り．

```bash
# リモートにアップロードする場合
$ scp {コピーする元のファイル} {リモートのユーザー名}@{リモートのホスト名}:{コピーする先のフォルダ}

# リモートからダウンロードする場合
$ scp {リモートのユーザー名}@{リモートのホスト名}:{コピーする元のファイル} {コピーする先のフォルダ}
```

この ":" が以外と重要で、忘れるとただの "cp" コマンドと何ら変わらなくなるので注意．

screen
-----
コメント頂いたので追記．

下のコメントから引用させてもらうと

> サーバー上に仮想端末を起動するので、クライアントからの接続が切れてもいつでもそのセッションに戻れる。
> というものですが、意外と知らない人がいるのかもしれません。
> 役に立つ場面としては、
> * 長い処理で接続が切れるのが不安な時（接続が切れても処理は続きます）
> * 週末や、仕事時間外の空き時間に、重いデータファイルをダウンロードさせておきたい。
> などでしょうか

というツール←
ただ，このツールはデフォルトでサーバーに入っているわけでは無い(入ってるサーバーもあるかも知れないけど，期待はできない)ので，自分でインストールする必要がある．
また，ただ仮想端末を起動するだけでなく，画面の分割やタブ機能等がついてたりする．
リモートサーバーに入った状態でタブ機能を使うと一々複数ターミナルを起動してそれぞれでログインといった事をしなくて済むので結構楽
最近では `tmux` という `screen` の進化系(?)のツールもある．

ls -h -F
-----
これは一般的な `ls` コマンドだけど，案外「あ，こんなのあるんか」みたいな事を言われたりするオプション．

-h はどうやら "human readable" の略らしい．使った時の挙動は下のを見てもらえれば大体検討はつくと思う．

```bash
da0shi@qiita [fuelphp] $ ls -l
-rw-rw-r--  da0shi  60258  CHANGELOG.md
-rw-rw-r--  da0shi   6526  CONTRIBUTING.md
-rw-rw-r--  da0shi   1069  LICENSE.md
-rw-r--r--  da0shi     67  README.md
-rw-rw-r--  da0shi   3243  TESTING.md
-rw-rw-r--  da0shi   1088  composer.json
-rw-r--r--  da0shi   5743  composer.lock
-rwxr-xr-x  da0shi 963760  composer.phar
drwxr-xr-x  da0shi    102  data
drwxrwxr-x  da0shi    612  docs
drwxrwxr-x  da0shi    272  fuel
-rw-rw-r--  da0shi   1451  oil
drwxrwxr-x  da0shi    204  public
```

```bash
da0shi@qiita [fuelphp] $ ls -lh
-rw-rw-r--  da0shi   59K  CHANGELOG.md
-rw-rw-r--  da0shi  6.4K  CONTRIBUTING.md
-rw-rw-r--  da0shi  1.0K  LICENSE.md
-rw-r--r--  da0shi   67B  README.md
-rw-rw-r--  da0shi  3.2K  TESTING.md
-rw-rw-r--  da0shi  1.1K  composer.json
-rw-r--r--  da0shi  5.6K  composer.lock
-rwxr-xr-x  da0shi  941K  composer.phar
drwxr-xr-x  da0shi  102B  data
drwxrwxr-x  da0shi  612B  docs
drwxrwxr-x  da0shi  272B  fuel
-rw-rw-r--  da0shi  1.4K  oil
drwxrwxr-x  da0shi  204B  public
```

さらに -F オプションを加えると以下のようになる

```bash
da0shi@qiita [fuelphp] $ cat ls-lhF
-rw-rw-r--  da0shi   59K  CHANGELOG.md
-rw-rw-r--  da0shi  6.4K  CONTRIBUTING.md
-rw-rw-r--  da0shi  1.0K  LICENSE.md
-rw-r--r--  da0shi   67B  README.md
-rw-rw-r--  da0shi  3.2K  TESTING.md
-rw-rw-r--  da0shi  1.1K  composer.json
-rw-r--r--  da0shi  5.6K  composer.lock
-rwxr-xr-x  da0shi  941K  composer.phar*
drwxr-xr-x  da0shi  102B  data/
drwxrwxr-x  da0shi  612B  docs/
drwxrwxr-x  da0shi  272B  fuel/
-rw-r--r--  da0shi    0B  ls-lhF
-rw-rw-r--  da0shi  1.4K  oil
drwxrwxr-x  da0shi  204B  public/
```

若干分かり辛いかもしれないけど，ファイルの種類によって末尾の記号が変わっている．

* 普通のファイルは何も無し
* 実行権限がある「ファイル」の末尾には __*__
* ディレクトリの末尾には __/__
* ここには無いけどシンボリックリンクの末尾には __@__

といった感じにそれぞれ付与される．
何故 "-F" なのかの説明は man では見当たらなかったけど多分 "File type" みたいな意味合いなんだろうなと思っている．

tar
-----

結構使われる割にオプションに対する知識無しで形だけで覚えてそうなコマンド

準備中...

ps
-----

準備中...

grep
-----

準備中...

パイプ (|)
-----

準備中...

リダイレクト (>)
----

準備中...


とりあえずこの辺で．