1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux 端末 シェル コマンド 基礎

Last updated at Posted at 2025-01-21

はじめに

  • コマンドを入力する
  • コマンドの実行結果を出力する

これらを行うためのインターフェースを提供するソフトウェアを 端末エミュレータ という。

端末エミュレータとしてよく知られているアプリケーションには macOS の ターミナル がある。

「ターミナル」という用語は、本来「端末(terminal)」を指すが、現在では「端末エミュレータ」を指して使われることが多い。

また以下の用語は歴史的に用途や形が大きく変化してきたため、現代では使う人の文脈や背景知識によって異なるものを指したり連想されたりすることが多い。

かつての端末(TTY)

Terminal

「端末」という用語自体は広い概念であり、一般的にはユーザがシステムと対話するための入出力インターフェース全般を指す。

英単語の terminal には、コンピュータ用語の他に「末端の、終着駅」という意味がある。

  • タイプライタ(入力装置)
  • プリンタ(出力装置)

から構成される物理的な装置を 端末 と呼ぶ。

ASR-33_1.jpg

出典:Dominic Alves from Brighton, England - ASR 33 Teletype, CC 表示 2.0
https://commons.wikimedia.org/w/index.php?curid=4259023による

英訳が terminal なので混乱してしまうが、ここでの「端末」はアプリケーション(ソフトウェア)のターミナルのことではなく、ハードウェアの端末装置を指す。

端末自身は CPU やメモリなどの計算能力を持たず、文字の入力受付や印字などといった接続された大型コンピュータとのデータ送受信のみを行う、シンクライアント的な存在であった

コンピュータが小型化して普及すると同時に、物理的な端末装置を模倣した 端末エミュレータ と呼ばれるアプリケーションがコンピュータ自体に搭載され、これに置き換わっていった。

端末はコマンドを解釈しない

現代で「入出力装置」と言えば、キーボードとディスプレイであるが、かつてはタイプライタとプリンタ(印字機)であり、この時代の端末は TTY(teletypewriter) と呼ばれた。

かつてのコンソール

コンピュータ初期のメインフレームと呼ばれる大型コンピュータは、キーボードとディスプレイで構成される 端末 に直接、接続されていた。

IBM_2260.jpg

IBM - https://digitaltmuseum.no/011015240147/22-0-ibm-modell-360-370, CC 表示-継承 4.0
https://commons.wikimedia.org/w/index.php?curid=113477774によるv

特に、端末でオペレータ(管理者)が操作するための専用画面は コンソール と呼ばれた。

コンソールは CUI 環境であるため、ターミナル のようなウィンドウ、タブ、マウス操作という GUI 的な機能は備えていない。

DEC_VT100_terminal.jpg

出典:Jason Scott - Flickr: IMG_9976, CC 表示 2.0
https://commons.wikimedia.org/w/index.php?curid=29457452による

またコンソールは カーネルに直結している という大きな特徴を持つ。

かつてのコンピュータは起動時に「標準のコンソール」を決定するため、ケーブルを途中で抜き差しすることは想定されておらず、

  • 1 台のコンピュータ
  • 1 つの専属コンソール
  • 1 人のオペレータ

といった対応関係で設計されていた。

現代のコンソール(仮想コンソール、TTY)

物理的な コンソール をソフトウェア化したもの。

かつてのコンソール同様に黒い画面であることには変わりないが、内部ではカーネルが /dev/tty1/dev/tty6デバイスファイル として管理していて、Ctrl + Alt + F1F6 で切り替えることができる(macOS のキー配列の場合 command + fn + F1 )。

Screenshot 2025-02-18 at 20.08.35.png

仮想コンソールは、起動時にカーネルによってデバイスファイルとして作成される。

OS が起動すると、SysVinit もしくは systemd などの initシステムgetty (get tty)プロセスを起動する。

getty の役割は以下を行うことにある。

  • デバイスとしての端末を open() する
  • シェルの標準入出力を open() した端末へ接続する
  • ユーザ名の入力を促すログイン用のプロンプトを表示する
  • login プロセスを起動し、ユーザが入力した情報を渡すことでログインを実行する

getty/dev/tty1/dev/tty2、 ... のデバイスファイルを システムコール open() によってオープンし、戻り値として取得した ファイルディスクリプタ の接続先を次のように割り当てる。

ファイルディスクリプタ 接続先
00 /dev/tty1(キーボード)
1(標準出力) /dev/tty1(画面出力)
2(標準エラー) /dev/tty1(画面出力)

これにより、シェルは 標準入力/dev/tty1(キーボード)から受け取り、標準出力を /dev/tty1(ディスプレイ)へと流せるようになる。

シェルの標準入出力の接続先は、 $ tty コマンドによって確認できる。

現在のシェルプロセスの標準入出力が接続されたデバイスファイルを表示する
$ tty
/dev/tty1
Ctl + Alt + F2 で仮想コンソールを tty1 から tty2 へ切り替えた場合
$ tty
/dev/tty2

getty はその後、下記のようなログインプロンプトを表示し、ユーザー名から入力された「ユーザ名」と「パスワード」を login プロセスに渡す。login プロセスは getty によって起動される。

Screenshot 2025-02-19 at 21.42.14.png

login プロセスはによる認証が完了すると、ユーザのデフォルトシェル(bash など)起動する。

現代の端末 / 端末エミュレータ

Terminal Emulator

物理端末 をソフトウェアによって模倣(emulate)したアプリケーション。

  • macOS の ターミナル
  • Linux の GNOME Terminal
  • Windows の コマンドプロンプト

などが代表的な端末エミュレータである。

(Windows の cmd.exe は端末エミュレータに分類されるが、PowerShell は本来シェルでありながら独自の端末環境を提供する。一方、Windows Terminal はこれらをホストする端末エミュレータとして動作する。)

Screenshot 2025-02-19 at 20.22.12.png

かつての物理端末と同様に、端末エミュレータ自体はコマンドの解釈や実行を行わない

キーボードを介して、ユーザーからテキストの形式で入力されたコマンドを シェル に渡し、実行結果をシェルから受け取る。端末エミュレータの標準入出力は、ユーザが起動したアプリケーションとしてのターミナルプロセスが仲介しており、実際には 疑似端末(PTY を通じてシェルと通信している。

コマンド入力という一面においては CUI による操作でも、実際にはウィンドウ、タブ、ペイン操作、マウス操作、コピー&ペーストなどができる GUI 環境上で動作している。Wikipedia ではこれを 「GUI 環境内で CLI(コマンドライン・インタフェース)を提供する」 と表現されている。

コンソール は完全な CUI 環境で動作するため、混同しがちな「ターミナルアプリ」と「コンソール」の大きな違いの一つがこの点にある。

デスクトップ環境のない環境では、端末エミュレータは存在しない。一方、デスクトップ環境のない環境でも仮想コンソールは存在する。

端末エミュレータは、複数のタブを開くことができ、タブごとにシェルを立ち上げることができる。

Screenshot 2025-02-20 at 7.59.41.png

ウィンドウシステム を搭載している デスクトップ環境 では、アプリケーションとしての端末エミュレータを複数起動させることもできる。

Screenshot 2025-02-20 at 7.57.55.png

各種製品が存在し、動作する環境や特徴が異なる。

端末エミュレータ 環境 特徴
ターミナル macOS macOS 標準搭載。
BashZsh などのシェルへアクセスできる。
iTerm2 macOS サードパーティ製。
タブ分割、複数ペイン表示、ショートカットなどの機能、カスタマイズ性が豊富。
xterm X Window System Unix 系 OS(特に Linux)で利用される。
カスタマイズ性が低いが軽量で動作が軽く、基本機能に特化。
リソースが少ない環境や古いシステムでの使用に適している。
GNOME Terminal X Window System GNOME デスクトップ環境 に標準搭載。
高度なカスタマイズ機能を持つ。
Windows Terminal Windows Windows 11 から標準搭載。
Windows 10 ではインストールが必要。
コマンドプロンプト Windows Windows 標準搭載。

端末エミュレータは、ローカルマシンの OS 上でシェルを動作させるだけでなく、SSH などを利用してネットワーク経由でリモート環境のサーバのシェルに接続し、操作する用途にも使われる。

擬似端末 / PTY

pseudo terminal

従来の 物理的な端末 を擬似的に再現した端末のこと。または端末エミュレータ上で論理的に分割された接続セッションのこと。

擬似端末(PTY)という概念を導入することで、1台のPC上で複数の端末(セッション)を並行して操作・利用することが可能になる

擬似端末はカーネルによって /dev/pts/0/dev/pts/1 のような デバイスファイル として作成される。

PTYマスタースレーブ のペアによって構成される。

  • マスター(Master)
    • 指示を出したり、データを制御する側
    • 端末エミュレータが操作する
    • /dev/ptmx
    • 主従関係を表す用語が差別的であることから、現代では コントローラ と呼ばれることもある
  • スレーブ(Slave)
    • 指示を受けたり、データを処理・提供する側
    • シェルが標準入出力として利用する
    • /dev/pts/N

ユーザからのコマンド入力は端末エミュレータからマスターに渡り、スレーブを経由してシェルへ送信される。

反対にコマンドの実行結果は、シェルからスレーブが受信し、マスターを経由して端末エミュレータに届けられる。

このように擬似端末は、仮想的に端末(TTY)をエミュレート(再現) しているにすぎない。

以下のコマンドで内部的に利用される。

ウィンドウシステム

グラフィカルユーザーインターフェース(GUI)を提供するための基盤となるソフトウェア。

以下の機能が提供される。

  • ウィンドウの移動、サイズ変更などの管理
  • 入力デバイス(マウス、キーボード)の管理
  • グラフィック描画の管理

X Window System

主に Unix 系を中心とする OS で GUI を提供するシステムを X Window System(または X や X11 と言う)。

X Window System は、マウスやキーボードを介して、ユーザがアプリケーションを操作するためのウィンドウを表示する。

Linux ディストリビューションでは OS と一緒に標準インストールされるが、技術的には OS と X Window System は別のコンポーネント。

クライアント - サーバ方式によって動作する。

X サーバーがディスプレイと入力デバイス(キーボード、マウス)などのハードウェアを管理する。またイベントを処理するのも X サーバの役割となっている。一方、X クライアントはアプリケーションのプロセスとして描画を要求する役割を持つ。

X Window System はウィンドウの基本的な表示や操作のみを提供し、ウィンドウの配置、タイトルバーの表示、アイコンの管理などは ウィンドウマネージャデスクトップ環境 によって行われる。

クライアント-サーバ方式のため、クライアントとサーバを別々のコンピュータ上で動作させることができ、これによりネットワーク経由で動作させることができる(X転送)。

近年では、Wayland という新しいプロトコルが登場している。

ウィンドウマネージャ

X Window System 上で動作するコンポーネント。ウィンドウの配置、サイズ変更、移動、装飾(ボーダーやタイトルバー)などを管理する。

FVWM や IceWM、Openbox、Metacity など。

ウィンドウマネージャ 特徴
Metacity GNOME向けのウィンドウマネージャ。
シンプルで使いやすい。
KWin KDEで使用されるウィンドウマネージャ。
カスタマイズオプションが豊富。
i3 軽量で効率的なタイル型ウィンドウマネージャ。
キーボードでの操作性が重視されている。
Openbox 軽量でカスタマイズ可能なウィンドウマネージャ。
デスクトップ環境に依存せず単独でも利用できる。

ターミナル

macOSに標準搭載されている 端末エミュレータ

文脈によっては、端末エミュレータそのものを指す場合がある。

プロンプト $ / % / #

prompt

端末エミュレータ が提供するCLIにおいて、ユーザーに対して入力を促す文字列や記号。

prompt には「促す」と言う意味がある。

シェルの種類によって特別な意味を持つ場合がある。

プロンプト 意味
$ 一般ユーザとしてログイン中であることを示す
# スーパーユーザ(管理者)としてログイン中であることを示す
% Zsh 等で利用される

シェル

コマンドを解釈して、カーネルに対するシステムコールを実行するソフトウェア。

GUIを持たず、端末エミュレータ のCLIを介して利用することができる。

Windows の PowerShell のように、シェルが端末エミュレータと一体になっていて、明確に区別できない場合もある。

BashZshsh など。

種類 特徴
Bash Unix系システムで広く使用される
Zsh 高度な機能とカスタマイズ性を持つ
sh 古いUnixシェルの一つ
コマンドライン(cmd.exe Windowsコンソールホスト上で動作
MS-DOS由来のコマンドが多い
Power Shell コマンドラインの後継
GUIを持つため、端末エミュレータでもある
オブジェクト指向

ログイン直後に起動されるシェルは ログインシェル と呼ばれる。

Bash

Bourne Again SHell

Unix系システムで広く使用されている標準シェル。

POSIX規格に準拠しており、ほとんどのUnix系システムで動作する。

$ bash

シェルとしての Bash を起動するためのコマンド。

新しいシェルセッションが開始される。

$ bash
$ bash

Zshを起動したターミナルから実行した場合、以下のような状態になる。

Bash を起動する
$ bash

The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$  # ログインシェルがBashに切り替わる
bash-3.2$exit # 起動した Bash を終了する

引数に Bash で記述したスクリプトファイルを指定することで、指定したスクリプトを起動した Bash 上で実行することもできる。

スクリプトファイルを実行する
$ bash myscript.sh

Zsh

Z Shell

高度な機能とカスタマイズ性を持つシェル。Bashと同様にPOSIX規格に準拠している。

近年の macOS のデフォルトシェル。

$ zsh

bash と同様に、新しいシェルセッションを開始する。

sh

Bourne Shell

古くから存在するUnixシェルの一つで、他の多くのシェル(BashZshなど)の基礎となっている。

「sh」と言う用語は、シェルスクリプトやコマンドを示すための一般的な総称として使われることがあり、Bash、Zsh、sh で記述されたスクリプトファイルの拡張子には .sh が使用される。

ログイン中のシェルを知る方法

$SHELL

$SHELL にはユーザがデフォルトでログインするシェルへのパスが格納されている。

ログイン中のシェルを知る方法
$ echo $SHELL
/bin/zsh

$0

$0 には、現在実行中のシェルまたはコマンド名が格納されている。

ログイン中のシェルを知る方法
$ echo $0
-zsh

$ ps

process status

現在実行中のプロセスのIDや、CPUやメモリの使用状況、実行時間、実行されているコマンドの名前などを確認することができる。

単に $ psとした場合、現在のシェルで実行されているプロセスの一覧が表示される。

ログイン中のシェルを知る方法
$ ps
 PID TTY           TIME CMD
5766 ttys000    0:00.04 -zsh
項目 意味
PID プロセスID
TTY プロセスが紐づく端末
TIME プロセスがCPUを使用した時間
CMD 実行中のシェルもしくはコマンド
PGID プロセスグループ

POSIX

Portable Operating System Interface

IEEE によって策定される Unix 系OS間での互換性を保つための規格。

開発者目線では、POSIX規格に従って開発することでプログラムが異なるOS間で移植可能になる。また、Windows OS は POSIX には準拠していない(WSL といった技術は提供されている)。

さまざまなサブ規格に分かれている。

カーネル

Kernel

主にプロセス、メモリ、デバイス、ファイルシステムの管理、アクセス制御などを行う OSの中核 部分を担うソフトウェア。

ハードウェアとソフトウェアの橋渡し的な役割を持つ。

通常、アプリケーション(プロセス)は、カーネルから提供されるインターフェースを介してのみ、デバイスへのアクセスが許されている。

software (1).png

この制限によって、デバイスに複数のプロセスが同時にアクセスする場合でも、カーネルが競合するアクセス要求を調停するため、アプリケーション間でリソースの競合が起きない仕組みになっている。

カーネルがアプリケーションに提供するインターフェースや、機能を利用するために呼び出す命令または関数を システムコール 、スーパーバイザコール(SVC:supervisor call)という。このインターフェースは、ハードウェアの仕様の違いに依存しないように抽象化されている。

カーネルモード / ユーザモード

CPUの動作モードには、カーネルモードユーザモード がある。

カーネルモードは、その名の通りカーネルや、デバイスドライバなどのプロセスが動作するモードで 特権モード とも呼ばれる。

カーネルモードのCPUは、メモリ、I/Oデバイスなどのハードウェアリソースに、制限なくアクセスを行うことができる。そのため、カーネルモードで不正な操作が行われたりバグが発生すると、メモリが破壊されたりデバイス動作が停止するといった、システム全体に影響が出る。

一方ユーザモードは、通常のアプリケーションプログラムが動作するモードであり、直接ハードウェアにアクセスを行うことができない。ユーザモードで動作するプロセスは、カーネルの提供するシステムコールを介してハードウェアにアクセスする。

システムコール

カーネルから提供される、プロセスがカーネルの特権的な機能を呼び出すためのインターフェース。

ユーザモード で動作中のCPUを、 カーネルモード へ遷移させる手段でもある。

システムコールの実行が終了すると、CPUはカーネルモードから再びユーザモードに戻ってプロセスの実行を継続する。

以下のような種類がある。

  • ファイル操作: open, read, write
  • プロセス管理: fork, exec, kill
  • ネットワーク通信: socket, connect

システムコールを呼び出すことができるプログラミング言語は複数ある。

  • C言語
  • アセンブリ言語
  • Rust
  • Go
  • Python
  • C++
  • Perl
  • Ruby
  • AssemblyScript / WebAssembly

C言語やアセンブリ言語は、OSやカーネル開発において主要言語として採用されることが多い。一方、PythonやPerlなどはシステムコールを直接呼び出す用途ではなく、ラッパーやモジュール経由で利用することが多い。

C言語には、glibc と呼ばれる 標準Cライブラリ が存在し、この中にはシステムコールを内部的に呼び出すラッパー関数が含まれている。アセンブリ言語は直接システムコールを呼び出すことができるものの、アーキテクチャ ごとに存在するシステムコールを環境に応じて呼び分ける必要がある。C言語では glibc のようなラッパー関数がアーキテクチャごとの違いを吸収するため、呼び出し側はその違いを意識する必要がない。

例外

プロセスがシステムコールを発行すると、CPUにおいて 例外 が発生する。

この例外をトリガーにして、CPUは ユーザモード から カーネルモード へ遷移し、システムコールの処理を行う。

システムコールの処理が終了すると、CPUは再びユーザモードに戻り、プロセスを継続する。

標準Cライブラリ

C言語に標準で付属しているライブラリ。システムコール のラッパー関数が含まれる。

  • 入出力操作(例: printf, scanf
  • メモリ管理(例: malloc, free
  • ファイル操作(例: fopen, fread, fwrite
  • システムコールのラップ(例: open, read, write
システムコール 標準Cライブラリのラッパー関数 説明
open open ファイルを開く
read read ファイルやデバイスからデータを読み取る
write write ファイルやデバイスにデータを書き込む
close close ファイルを閉じる

コマンド

シェルに対する命令。端末エミュレータ への入力を介して実行する。

コマンドの実体は実行可能ファイルであり、実行可能ファイルにはバイナリ形式とスクリプト形式がある。

コマンドの実体は実行可能ファイル

またその他にも以下の形式のコマンドもある。

実行可能ファイル(バイナリ形式)

ファイルシステム上に配置されたバイナリ形式の実行可能ファイルは、コマンドとして実行することができる。

呼び出したシェルとは別プロセスとして実行される

例:lsgrepcat

実体はそれぞれ、/bin/ls/usr/bin/grep/bin/cat などで、ファイルに拡張子は無い。ビルトインコマンド を内部コマンドと呼ぶのに対して、バイナリ形式の実行可能ファイルを 外部コマンド と呼ぶことがある。

Linux ではバイナリ形式の実行可能ファイルに拡張子はつけない

バイナリ形式の実行可能ファイルは絶対パスで実行することもできるし、ファイル名だけでも実行できる。

絶対パス
$ /bin/ls
ファイル名
$ ls

ファイル名を与えただけでシェルがファイルを探し当てることができるのは、環境変数 $PATH の存在があるためである。

$ ls が実行された時、シェルはまず環境変数 $PATH から ls ファイルがないかを探している。

もし環境変数 $PATH/bin が設定されていない場合には、シェルは ls ファイルを見つけることができず、ファイル名だけでコマンドを実行することはできない。一方で、ビルトインコマンドは $PATH を使用しないので、設定がなくても実行することができる。

※ 正確には下記の順に検索が行われる

  1. エイリアス
  2. ビルトインコマンド
  3. 環境変数 $PATH

なお、$PATH にはカレントディレクトリを含めることができないため、カレントディレクトリ上の実行可能ファイルを実行するには ./ に続けてファイル名を指定する必要がある。

カレントディレクトリ上の実行可能ファイル
$ ./ファイル名

$ which

コマンドの実行可能ファイルの絶対パスを表示する
$ which コマンド名
$ which ls
/bin/ls

※ PATH が通っていないコマンドは表示されない

$ whereis

コマンドの実行可能ファイル(バイナリファイル)、ソースコード、マニュアルファイルのパスを検索する
$ whereis コマンド名
$ whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1

$ type

コマンドがビルトインコマンドか、実行可能ファイルか調べる
$ type コマンド名
$ type ls
ls is /bin/ls

$ type cd
cd is a shell builtin

$ kill コマンドのように、ビルドインコマンドと実行可能ファイルの両方を持つものもある。

$ command

ビルトインコマンドと外部コマンドを使い分ける際に利用される。

$ command 自体はビルトインコマンド。

同じ名前のコマンドにビルトインコマンドと外部コマンドがある場合、通常はビルトインコマンドが優先して使用される。

このようなとき、$ command を利用することで明示的に外部コマンドを実行することができる。

外部コマンドを実行する
$ command コマンド

他にも、外部コマンドと同名の エイリアス が設定されている場合に、エイリアスを無視して外部コマンドを優先して実行させることができる。

実行可能ファイル(スクリプト形式)

スクリプトファイルは実行権限を付与することで、スクリプト としてシェルから実行することができる。

(コマンドの実体を理解するために、あえてバイナリ形式とスクリプト形に分類していますが、通常はコマンド実行者が「このコマンドはバイナリファイルなのか、スクリプトファイルなのか」などを気にする必要はありません。また、スクリプトファイルが実行権限エラーで実行できないと言う私自身の経験から権限の付与が必要であることを強調していますが、実行権限はバイナリファイルにも必要です。)

スクリプト

  • Bash
  • Zsh
  • Python
  • JavaScript
  • PHP
  • Perl
  • Ruby

などの他のソフトウェアの動作を制御するために使用されるプログラミング言語をスクリプト言語と言う。

スクリプト言語で記述されたプログラムは スクリプト と呼ばれ、以下の拡張子が使用される。

  • .sh : Bash, Zsh など
  • .py : Python
  • .pl : Perl
  • .rb : Ruby
  • .js : JavaScript

また、OSの動作を制御するための Bash、 Zsh、 sh で記述されたスクリプトを特に シェルスクリプト と言う。Windows では、シェルスクリプトは バッチファイル と呼ばれる。

スクリプトはインタプリタによって逐次解釈・実行されるため、実行前にコンパイルを行う必要がない。スクリプトを実行させる場合、言語に対応するインタプリタを実行環境にインストールする必要があるが、Bash(言語)のようなシェルスクリプトはシェル(Bash)自身が解釈・実行する。

ビルトインコマンド

シェルに組み込まれたコマンド。内部コマンドと呼ばれることもある。

シェルによって直接実行されるため、呼び出したシェルのプロセス内で実行される

cdpwdechoaliasexport など。

ビルトインコマンド
$ type cd
cd is a shell builtin

バイナリ形式の実行可能ファイル とは異なり、環境変数 $PATH 上に実行可能ファイルを配置する必要がない。

関数

シェルスクリプトで定義した関数はコマンドのように実行することができる。

関数
$ function say_hello { echo "hello world" }
$ say_hello
hello world

エイリアス

既存のコマンドには エイリアス と呼ばれる「別名」をつけて実行することができる。

登録済みエイリアスは $ alias で表示することができる。

エイリアス一覧
$ alias

新たにエイリアスを定義する際は、次のようにエイリアス名とコマンド名を = で指定する。

定義
$ alias エイリアス名=コマンド
$ alias hello='echo "hello world"'
$ hello
hello world

セミコロン ; を使うと、複数のコマンドを集約させることもできる。

複数のコマンドにエイリアスをつける
$ alias hello='echo "hello";echo "bye"'
$ hello
hello
bye

引数にエイリアス名を指定すると、エイリアスにしたコマンドを表示することができる。

指定されたエイリアスの中身を表示
$ alias エイリアス名
$ alias hello
hello='echo "hello world"'

$ alias コマンドで登録したエイリアスは、現在ログイン中のシェルセッションでのみ有効。永続的なエイリアスを登録したい場合、シェルの 環境設定ファイル に定義を追加する。

Bash を使用している場合 ~/.bashrc~ : ホームディレクトリ)という環境設定ファイルがシェル起動時に読み込まれているため、このファイルに以下の1行を追加しておくことで永続的なエイリアスを追加することができる。

~/.bashrc
alias hello='echo "hello world"'

編集した ~/.bashrc ファイルは端末エミュレータを再起動するか、source コマンドを使って、シェルに再読み込みさせることができる(sourcebash の違い )。

環境設定ファイルを再読み込みさせる
$ source ~/.bashrc

エイリアスを削除する場合、$ unalias コマンドを使用する。

削除
$ unalias エイリアス名

変数

シェル変数

ログイン中のシェルセッションでのみ有効な変数。

宣言する
$ 変数名=

で宣言し、

参照する
$ $変数名

で参照することができる。

$ hello=こんにちは
$ echo $hello
こんにちは

文字列中の変数の展開

文字列中で変数を展開したい場合は、

文字列中でシェル変数を展開する
$ echo "$変数名"

もしくは

文字列中でシェル変数を展開する
$ "${変数名}"

とする(' シングルコーテーションで囲った文字列中の変数は展開されないため注意)。

' シングルコーテーションで囲った文字列中の変数は展開されない

特に、パスのようにスペースを開けずに変数を使用したい場合は ${変数名} を使用する。

シェル変数
$ hello=こんにちは

$ echo $hello
こんにちは

$ echo "$hello"
こんにちは

$ echo "$hello world"
こんにちは world

$ echo "$helloworld"
# 変数 helloworld が未定義のため、何も出力されない

$ echo "${hello}world"  # 変数に続いてスペースなしで文字列を使用する場合
こんにちはworld

set コマンドを使用すると、実行中のシェル環境内で定義された全ての変数(シェル変数、ビルトインシェル変数環境変数)を表示することができる。

$ set
$ set

unset コマンドでシェル変数を削除できる。

$ unset
$ unset 変数名

ビルトインシェル変数

シェルであらかじめ宣言されている変数。

ビルトインシェル変数
$? 直前の実行コマンドの終了ステータス
成功の場合は 0、失敗の場合 0 以外の値が格納
$0 実行中のシェルの名前、もしくはコマンド名
$# シェルスクリプト内で、スクリプトに渡された引数の数を取得
$1,$2,$3... シェルスクリプト内もしくは関数内で、渡された引数が順に格納される(1番目は $0 ではなく $1
$*,$@ シェルスクリプト内で、スクリプトに渡されたすべての引数を取得
$*:一つの文字列として格納
$@:文字列の集合として格納
$$ 実行中のシェルのプロセスID
$! 最後にバックグラウンドで生成されたコマンドのプロセスID
$PATH 実行可能ファイルの検索パス(複数のパスが:で区切られた文字列として格納される)
$HOME ユーザのホームディレクトリのパス
~ でも取得可能
$PWD 現在の作業ディレクトリ
$OLDPWD $ cd で移動する前の作業ディレクトリ
$SHELL 現在使用されているシェルのパス(/bin/bash/bin/zshなど)

終了ステータス / $?

直前の実行コマンドの終了ステータス。0 ~ 255 が使用可能。

  • 成功: 0
  • 失敗: 0 以外

自作のスクリプトで終了ステータスを呼び出し元に返すには、exit コマンドを使用する。

終了ステータス
exit 0    # 正常終了(成功)
exit 1    # 異常終了(エラーなど)

これを利用して、異常が発生したらスクリプトを終了させることができる。

異常が発生したらスクリプトを終了させる
if [ $? != 0 ]; then 
    exit 1;
fi

エラー発生後に echo コマンドで $? を確認した場合、echo コマンドの成否が $? に再代入される点に注意。

続けて echo $? を実行した場合
$ cd not_exixts_directory
cd: no such file or directory: not_exixts_directory

#  $? には cd コマンドの終了ステータスが格納
$ echo $?
1

# $? には echo コマンドの終了ステータスが格納
$ echo $?
0

環境変数

シェルまたはシステム全体で使用される変数。

親プロセスから子プロセスに引き継がれるため、環境変数を介してプログラム間で情報を共有することもできる。

$ export を使用することで環境変数を設定し、子プロセスに引き継がせる。

$ export
$ export 定義済み変数名
$ export 環境変数名=
$ export PATH="/some/directory:$PATH"

末尾の :$PATH は、a = 1 + a という形で既存の $PATH を上書きしないようにしている。

echo とリダイレクト演算子 >> を利用して追加することもできる。

Bash
$ echo 'export PATH="/some/directory:$PATH"' >> ~/.bashrc  # Bash
$ echo 'export PATH="/some/directory:$PATH"' >> ~/.zshrc   # Zsh
Zsh
$ export PATH="/some/directory:$PATH"

$ printenv

また、$ printenv で環境変数の一覧を表示する。

一覧を表示する
$ printenv 

特定の環境変数を指定することもできる。

$ printenv
$ printenv 環境変数名

$ env

環境変数を表示したり、一時的な環境変数を設定しながら別のコマンドを実行する。

単に $ env とした場合、$ printenv と同様に環境変数の一覧が表示される。

一覧を表示する
$ env

下記のように記述すると、一時的に環境変数を設定してコマンドを実行することができる。

一時的に環境変数を設定してコマンド実行を行う
$ enc 環境変数名=値 コマンド

コマンド置換

$() でコマンドを囲うと、コマンドの実行結果を文字列に展開して、別のコマンドの引数として渡すことができる。

コマンド置換
$ echo $(コマンド)
$ echo `コマンド` # 「`」はバックコーテーション

文字列中の変数の展開 同様に文字列内でも展開することができるが、シングルコーテーション内では展開されないため注意。

文字列中のコマンド置換
$ echo "ls: $(ls)"
$ echo "ls: `ls`"

$ echo '$(ls)' # コマンド置換されない

' シングルコーテーションで囲った文字列中のコマンドは展開されない

複数のコマンドを続けて実行する

; で複数のコマンドを続けて実行させることができる。コマンド実行結果にかかわらず、後続のコマンドは実行される。

;
$ コマンド1; コマンド2; コマンド3

&& では、コマンドが正常終了した場合のみ、後続のコマンドが実行される。

&&
$ コマンド1 && コマンド2 && コマンド3

|| では、コマンドが異常終了した場合のみ、後続のコマンドが実行される。

||
$ コマンド1 || コマンド2 || コマンド3

() で複数のコマンドをまとめることもできる。

()
$ (コマンド1; コマンド2; コマンド3) && コマンド4

コマンド履歴

$ history コマンドで履歴を表示することができる。

$ history
$ history
履歴番号 コマンド

で表示された履歴番号は、! で指定して実行することができる。

指定した履歴番号のコマンドを実行
$ !履歴番号
直前の履歴コマンドを実行
$ !!
検索ワードにヒットするコマンドを実行
$ !検索ワード

Bashの場合 ~/.bash_history にコマンド履歴が保存され、保存できる履歴の最大数は環境変数 $HISTSIZE$HISTFILESIZE で設定できる。

また、Ctrl + R の同時押しでコマンド履歴を検索することもできる(reverse-i-search:逆順インクリメンタル検索)。

Ctrl + R を同時押しで検索モードに切り替える
$ # Ctrl + R を押す
bck-i-search: _

検索モードからは Ctrl + G もしくは Esc で戻ることができる。

コマンド履歴の検索
$ # ←ここに検索ワードを入力する
bck-i-search: _

検索にヒットした履歴は、再び Ctrl + R を押すことでさらに過去のヒット結果に移ることができる。

履歴の位置は保存されるため、Ctrl + G で検索を終了した時、 を押すと、ヒットした履歴の位置からの表示になる。

標準入出力 / リダイレクト / パイプ

複数行のコマンド入力

複数行のコマンドを入力したい場合、行末にバックスラッシュ \ を記述する。

複数行のコマンド入力
$ echo \
$ "hello world"
hello world

$ source / $ .

指定したファイル内にあるシェルスクリプトを現在のシェル環境で実行する。

$ source
$ source スクリプトファイル名

環境設定ファイルを編集した際に、シェルを再起動することなく反映させるために使用される。

$ source ~/.bashrc

$ source コマンドで読み込んだスクリプトは、現在起動しているシェルのプロセス内で実行されるため、環境変数やエイリアスなどを、起動中のシェル環境に適用させることができる。

ドット $ . もコマンドであり $ source と同じ機能を持つ。

source
$ . ファイル名

$ source$ bash との違い

$ source
$ source スクリプトファイル名

$ source呼び出したシェルプロセス内で実行される

$ bash
$ bash コマンド名

一方、bash は呼び出し元のシェルが新しいシェルプロセスを起動し、引数に渡したコマンドは新たに起動したBashのプロセス上で実行される。

そのため、

$ bash ~/.bashrc

としても、設定の変更や変数の宣言は呼び出し元のシェルプロセスには反映されない。

$ man

manual

コマンドのマニュアルページを表示する。

マニュアルを表示する
$ man コマンド名

表示されたマニュアルは Q キーを押すことで終了する。

$ man コマンドは、コマンドのマニュアルページだけでなく、設定ファイル、ライブラリ、システムコールなどのマニュアルページも表示させることができる。

$ man 検索ワード

-f : 完全一致 ($ whatis コマンドと同じ)
-k : 部分一致 ($ apropos コマンドと同じ)

マニュアルページにはセクションと呼ばれる分類があり、セクション番号があらかじめわかっている場合、番号を指定して検索を行うことができる。

セクション番号で範囲指定して検索
$ man セクション番号 検索ワード
セクション 内容
1 ユーザコマンド
2 システムコール
3 標準Cライブラリ
4 デバイスファイル
5 設定ファイル
6 ゲーム
7 その他
8 システム管理コマンド
9 Linux独自のカーネル用ドキュメント

$ exit

現在のシェルセッションや、スクリプトの実行を終了させる。

$ exit
$ exit

引数に数値(終了コード)を指定することで、終了ステータスをシェルや親プロセスに返却することができる。

終了ステータス
$ exit 0    # 正常終了(成功)
$ exit 1    # 異常終了(エラーなど)

直前に実行したコマンドの終了ステータスは、$? に格納される。

正常終了時
$ echo "hello"
hello

$ echo $?
0
異常終了時
$ hello
zsh: command not found: hello

$ echo $?
127

$ shutdown

シャットダウンする(halt)
$ shutdown -h now
再起動する(reboot)
$ shutdown -r now
21時にシャットダウンする
$ shutdown -h 21:00
予定したシャットダウンをキャンセルする(cancel)
$ shutdown -c

$ tmux

Terminal Multiplexer

擬似端末 のセッションを管理するターミナルマルチプレクサ。

マルチプレクサ(MUX)は、複数の入力信号の中から1つを選択して出力するデジタル回路や装置のこと。

$ tmux を利用することで、1つのターミナルアプリ内で複数の擬似端末を管理することができる。

ターミナルのタブ機能やペイン機能に似た操作ができるが、これらはターミナルアプリの GUI による視覚的な管理であるのに対し、$ tmux は CUI による管理という違いがある。

通常、ターミナルのタブやペインに紐づくプロセスはターミナルを閉じると終了するが、$ tmux のセッションは tmux プロセスが動いている限り維持される。

また $ tmux には デタッチアタッチ という特徴的な機能がある。

さらに $ ssh を利用したネットワーク越しの操作において、作業途中で接続が切断された場合でも、tmux のセッションは端末の外部で動いているので、SSH切断の影響を受けず、サーバー上で動作し続ける。そのため、SSH再接続後に作業を再開させることができる。

$ tmux コマンドの実行により、新規セッションが作成される。

セッションを開始する
$ tmux
名前付きセッションを作成する
$ tmux new -s セッション名

tmux セッション内での操作は主にキー入力によって行うことができる。Ctrl + B を押した後に特定のキーを再び押すという順番になっていて、Ctrl + B を プレフィックスキーと言う。

キー 説明
Ctrl + BC 新しいウィンドウを作成(Create)
Ctrl + BN 次のウィンドウに切り替え(Next)
Ctrl + BP 前のウィンドウに切り替え(Previous)
Ctrl + B& 現在のウィンドウを削除
Ctrl + B% 垂直にペインを分割
Ctrl + B" 水平にペインを分割
Ctrl + B矢印キー アクティブなペインを切り替え
Ctrl + BD デタッチ
$ tmux attach アタッチ
$ tmux new 新しいセッションを作成
$ tmux new -s セッション名 セッション名を指定して新しいセッションを作成
$ tmux list-sessions セッションを一覧表示
$ tmux kill-session セッションを終了
$ tmux kill-session -t セッション名 指定したセッションを終了

デタッチ / アタッチ

Detach / Attach

$ tmux擬似端末 との接続を管理する役割を果たす。

(学習メモ:自分のようなLinux初学者には、デタッチやアタッチのイメージが非常に湧きづらかった。「計算装置(サーバ)に接続された 物理的な端末装置(キーボードとディスプレイ)」を頭に思い浮かべると、tmux のデタッチ・アタッチの動作をイメージしやすいかもしれないと思った。昔は「端末を切り替える」と言ったら、作業者が端末Aから端末Bに移動するしかなかった。)

デタッチ

  • 現在のターミナルから tmux セッションの接続を切る
  • (作業者が端末の席から離れる、もしくはディスプレイの電源を切るイメージ)
  • tmux セッション自体はサーバー上で動作し続ける
  • 現在のターミナルからは操作できなくなる

アタッチ

  • tmux セッションを開く
  • (作業者が端末前の席に座る、もしくはディスプレイの電源を入れるイメージ)
  • ターミナルを通じて tmux セッションを操作できる状態になる
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?