Linux勉強会 第1回：仮想コンソールとファイル操作

2月3日、株式会社Ancarで社内勉強会を行いました、この記事はその勉強会トピックのおさらいです

「Linuxの基礎からやるぞ！！！」という内容ですので、基礎的な内容であることをご承知おき下さい

各コマンドの実行はmacOSの標準ターミナルを使用しています

# おしながき
- <a href="#仮想コンソール">仮想コンソール</a>
    - <a href="#で仮想コンソールで何ができるのか">仮想コンソールで何ができるのか</a>
    - <a href="#ttyを指定して出力">ttyを指定して出力</a>
- <a href="#ファイル操作">ファイル操作</a>
    - <a href="#ファイルの簡易作成方法">ファイルの簡易作成方法</a>
    - <a href="#ファイル名の指定方法">ファイル名の指定方法</a>

# 仮想コンソール
通常、一台の端末に複数の接続を行うことができますが、その際それぞれに`仮想コンソール`というものが割り当てられます
それぞれの仮想コンソールには`tty?番`という風に名前が付きます
ttyは`TeleTYpewriter（テレタイプライター）`に由来する言葉で、入出力装置を指すようです
ttyを切り替えることで端末内で別画面に切り替えたような動作が実現できます
(現在は複数のコンソール画面が立ち上げられるため、切り替え操作は割愛します）


実際に`tty`コマンドを使用して現在使用中の仮想コンソールを確認してみます

```
$ tty
/dev/ttys000
```

`tty000`を使用していました
今度は別ウィンドウでコンソールを立ち上げ`tty`を打ってみます

```
$ tty
/dev/ttys001
```

それぞれのコンソールに別のttyが割り振られています、なるほど

`who`コマンドで見てみます

```
$ who
yungo    console  Feb  9 22:56
yungo    ttys000  Feb 10 10:16
yungo    ttys001  Feb 11 13:46
yungo    ttys002  Feb 11 13:47
yungo    ttys004  Feb 10 20:01
yungo    ttys005  Feb 10 21:14
```

現在ユーザ名`yungo`で5つコンソールを立ち上げていたのですがそれぞれにttyが割り振られていました、なるほどなるほど
(一つ目の`console`はカーネルみたいですね、間違えてたらご指摘下さい)

## で、仮想コンソールで何ができるのか

- `tty1`と`tty2`で同一のユーザにログインし、片方で`man（マニュアル）`を表示しながら片方で作業
- `tty1`と`tty2`でそれぞれ別のユーザにログインし、ユーザを使い分けながら並行で作業
- `tty1`でフリーズした際に`tty2`でログインしフリーズしたアプリケーションをkillする
- `tty1`で`&`をつけ忘れて大きなコマンドを実行した、しかし[Ctrl]+[z]が使用できなかったとき、`tty2`でコマンドをkillし、再度`&`をつけて実行する
- `tty1`で一般ユーザ、`tty2`でrootユーザでそれぞれログインし、アクセス権を使い分ける

などなど
普段は意識せず別ウィンドウでコンソール立ち上げて行う作業ですね（まさにそれが仮想コンソールなのですが）

## ttyを指定して出力
```
$ echo hoge
hoge
```
echoは通常は自分の端末に返ってきますが

```
$ echo hoge > /dev/tty2
```
とすると、`tty2`にechoが出力されます
手元のコンソールではこんな感じになりました↓
<img width="552" alt="スクリーンショット 2020-02-11 14.56.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213915/0a51577b-15f2-35e2-e8f1-42abe4ea1bbb.png">
tty000で入力したechoがtty001のカーソル位置に出力されました

-------

お話変わって、ここからは第二部、ファイル操作編です
# ファイル操作

## ファイルの簡易作成方法
エディターを起動せずファイルを簡易的に作成する方法がいくつかあります
### １：`echo`とリダイレクト
```sh
# 1行ファイルの作成
$ echo hogehogehogehoge > file1.txt

# 中身を確認してみます
$ cat file1.txt
hogehogehogehoge

# リダイレクトだと上書き
$ echo hoge > file1.txt

$ cat file1.txt
hoge

# 追加リダイレクトだと追記
$ echo hoge >> file1.txt

$ cat file1.txt
hoge
hoge
```

### 2:`cat`とリダイレクト
`cat`って中身を表示するだけのコマンドだと思ってましたがリダイレクトを使用することで（とても）簡易的なエディタみたいな使い方ができます、知らなかった

```
# [ctrl]+[d]で終了
$ cat > file2.txt
hoge
ho
hoge
[ctrl]+[d]

# 中身を見てみます
$ cat file2.txt
hoge
ho
hoge
```

### 3:`touch`
中身のない0バイトのファイルを作成できます
本来`touch`コマンドはファイルの更新日時を更新するためのコマンドらしいですね…知らなかった…

```
# ディレクトリを確認
$ ls
file1.txt	file2.txt

# 作成
$ touch file3.txt

# ディレクトリを確認
$ ls
file1.txt	file2.txt	file3.txt
```

## ファイル名の指定方法
先程から`cat file1.txt`のようにファイル名を指定していますが、これにもいくつか方法があります

### ワイルドカード

| 記号 | 説明 |
| :-- | :-- |
| `*` | 任意の文字列。空文字でもよい |
| `?` | 任意の1文字 |
| `[...]` | `[` `]` 内に含まれる任意の1文字 ( `-` 記号で範囲指定できる ) |
| `[!...]` |  `[` `]` 内の . . . に含まれない任意の1文字 |
| `{` ~ `}` | `{` `}` 内に含まれる任意の文字列 ( カンマで区切る ) |

(追記)`{ ~ }`はワイルドカードには含まれないみたいです
`*`等のワイルドカードはパス名展開、`{~}`はブレース展開となっていて、挙動も異なります
（教えていただいた@angel_p_57さん、本当に感謝です！）


先程のディレクトリで試してみます

```
# 任意の文字列（*以降は何でも該当）
$ ls file*
file1.txt	file2.txt	file3.txt

# 2か3に該当するもの
$ ls file[23].txt
file2.txt	file3.txt

# 範囲指定もできます
$ ls file[1-3].txt
file1.txt	file2.txt	file3.txt

# 単語がマッチするもの
$ ls {file,filo}1.txt
file1.txt	filo1.txt
```

おおよそ正規表現っぽく使えるみたいですね

-------

今回はここまでです！！


# さいごに

基礎的な内容が多めですが、いつも使っているコマンドにも知らなかった小技が多いなという印象です
いつも作業時は沢山ウィンドウを開くことになりますが、ttyの概念も念頭に置く必要がありますね

加筆修正、大歓迎ですのでぜひコメントにお願いします！

**LINUXチョットデキル（本当の意味で）**