シェルコマンドで「あれもこれもそれも」とやりたい時・やらせた後の確認の仕方

「SSHで入ったサーバーに『ウィンドウマネージャ』や『デスクトップ環境』が入っている事は大変稀」
と思う。

そのサーバーやコマンドでの操作で、
「実行後に出力が出るまで時間の掛るコマンド」
を叩いた後で、
「あー、コマンド入力で操作するコンピューターって、 *シングルタスク* じゃん。LinuxやFree(もしくはOpen)BSD、果てはUNIXが *マルチタスク* って言ってるのは誇張じゃねえのか？」
と思う方がもしかしたら居るかもしれないという杞憂で書き初めた。

ちょっと読み易い様に逆引きを意識して章立てをしてみたりする程には、筆者はこれらのコマンドを忘れがちである。

# 本題の前に
あくまで筆者はワンライン否推奨派である。むしろコンピューターとチャットをする様にコマンドは叩きたい。

しかし横着する方向を誤る性分なので、以降には 
「 `alias` を指定したら良いのに」
「実行したら出力が醜い(見難い)」
と思われるネタ技が散見されるであろう事はご容赦頂きたい。

また、筆者は主に `fish` たまに `bash` を使う程度のニワカで、`zsh` や `eshell` はチットモデキナイ。申し訳無いが `zsh`, `eshell`の方々は `man` を読んだ方が確実に有益である。 `fish`, `bash` をお使いの方々で、
「 `man` や 『Language Syntax』、『言語仕様』の説明書きやドキュメントくらい読めらぁっ!!」
という方も確実に `man` を読んだ方が有益である。

# 「あれもこれもそれも」編

「あれ」「これ」「それ」を一度に叩きたい時の小ネタ

## 「あれ」「これ」「それ」を逐一やらせたい
`;` を使ってコマンドを繋げるとできる。実例；

```shell-session
$ sudo apt update; sudo apt full-upgrade -y; sudo snap refresh; flatpak update -y; .emacs.d/bin/doom upgrade
```

Debian系列やUbuntuではお馴染みの `apt` パッケージマネージャーでパッケージ情報の、ついでに `snap` と `flatpak` といった「ユニバーサルパッケージシステム」のパッケージマネージャーもアップグレードをしてる。

ただし次に記す方法で並行して実行すると出力がとてつもなく見辛くなる。

また、最後にEmacsディストリビューションの『DOOM Emacs』のアップグレードを対話(確認)してもらいながら行う。

## 「あれ」「これ」「それ」を一気にやらせたい
`&` を使ってコマンドを繋げるとできる。実例；

```shell-session
$ sudo apt update & sudo apt full-upgrade -y & sudo snap refresh & flatpak update -y
```

 `apt` パッケージマネージャーでパッケージ情報の、ついでに `snap` と `flatpak` といった「ユニバーサルパッケージシステム」のパッケージマネージャーでもアップグレードをしてる。

ただし出力がとてつもなく見辛い。

## 「あれ」が正常終了したら「これ」をやる
何番煎じのネタだが、実例；

```shell-session
$ sudo apt update && sudo apt full-upgrade
```

口説いが `apt` コマンドである。

「パッケージリスト更新(`update`)が正常にできたら、更新可能パッケージの更新(`full-upgrade`)」
`full-upgrade` にあえて `-y` を付けないで、更新するパッケージの確認をしてから続行するか否かを選択する事もある。

### 蛇足
`||` で `;` 同等の事も可能。

数理論理学・集合論、もしくは「足し算(加算)と掛け算(乗算)の入り混った計算も暗算できる」方なら気付かれたかもしれないが、 `&&` の前に実行されたコマンドが正常終了しなかった場合には、`&&` 以降のコマンドは実行されない。

## 今までの応用実例

と言っても大した事はしていない上に、多少引っ掛けがある。

```shell-session
$ sudo apt update && sudo apt full-upgrade -y; sudo snap refresh & flatpak update -y & .emacs.d/bin/doom upgrade
```

`apt` が管理しているパッケージには、以降に続く `snap` や `flatpak`, `emacs` そのものも含まれているため、一旦この様に実行する。

# 「あれやこれやそれ、どうなった？」編
以下も該当するかもしれない：

* `vi` や `vim` で編集中に手癖で<kbd>Ctrl</kbd>+<kbd>z</kbd>を押してしまったりして、シェルに移った時の確認
* コマンドを実行したものの、応答が無さすぎてコマンド入力もできない時

## 一括(もしくは末尾に `&` を付けたコマンド)が動いてるかの確認

`jobs` で確認。実例；

```shell-session
$ jobs
Job	Group	CPU	State	Command
3	35267	0%	stopped	sudo apt full-upgrade -y
1	34097	0%	stopped	flatpak update -y &
```

## 動かしたコマンドの確認に答える・入る

`fg %[1-n]` で一つだけ入力できる様になる。実例；

```Console
$ jobs
Job	Group	CPU	State	Command
3	35267	0%	stopped	sudo apt full-upgrade -y
1	34097	0%	stopped	flatpak update -y &

$ fg %1
-- # flatpak update -y の進捗が表示される --
-- # 場合によっては[y/N]みたいな事に答えれる --
```

`vi`, `vim` も同様の方法で編集しなおせる。

## 動かしたコマンドが `stopped` だが再開させる。
`bg %[1-n]` で再開させる事ができる。実例；

```Console
$ jobs
Job	Group	CPU	State	Command
3	35267	0%	stopped	sudo apt full-upgrade -y
1	34097	0%	stopped	flatpak update -y &

$ bg %3
-- # flatpak update -y の進捗が表示される --
-- # 場合によっては[y/N]みたいな事に答えれる --
```

### 蛇足
`fg`, `bg` も `;` で繋げる事が可能なので；

```Console
$ fg %1; bg %2 %3 %4
```
という事も可能。

## 動かしたコマンドが想像以上に重たいし、キー入力も受け付けない時
大抵のシェル環境では<kbd>Ctrl</kbd>+<kbd>z</kbd>で、
「現在 `fg` 動作しているコマンドを一時停止( `stopped` )して、シェルコマンド入力画面に遷移する」
動作になっている。

ただしそのキーバインドが「仮想端末(仮想ターミナル)」のキーバインドと重複している場合は上記の限りではない。

# まとめ
前座で；
> 「あー、コマンド入力で操作するコンピューターって、 *シングルタスク* じゃん。LinuxやFree(もしくはOpen)BSD、果てはUNIXが *マルチタスク* って言ってるのは誇張じゃねえのか？」
と思う方がもしかしたら居るかもしれないという杞憂で書き初めた。

と書いた通り実例を交えて書いた。

もっと詳しくは；
> 確実に `man` を読んだ方が有益である。

```Console
$ man man && man 1 bash
```

# `man` 代わりのWebページ
* [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

# 想定される質問
* 「それ、『タスク』じゃなくて『ジョブ』ですよね？」
  * A：それは思った。でも「デスクトップ環境」や「ウィンドウマネージャー」に慣れ親しんでいる方々はほぼ同じに捉えるかと浅はかで軽んじた発想で指を動かした。