【Linux】シェルの使い方-基本構文/コマンド履歴/引用符/リダイレクト
この記事からわかること
- Linux:コマンドとは?
- 基本的なシェルの使い方と操作方法
- 機能やショートカット
- 基本構文/コマンド履歴/引用符/リダイレクト
- historyやteeコマンド
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
シェルとは?
シェルとはパソコンを制御しているソフトウェア(OS)と利用するユーザーとを繋ぐ機能のことです。パソコンを操作する際マウスなどを使って操作する方法をGUI(Graphical User Interface)、文字(コマンド)入力を行い操作することをCUI(Character User Interface)と言います。
CUIの種類の1つが「コマンドライン」です。WindowsのコマンドプロンプトやMacのターミナルがコマンドラインとして操作するためのアプリケーションとして提供されています。
コマンドラインに任意のコマンドを打ち込み実行するとシェルがそのコマンドを読み込んだ後内部的にOSへ命令を送り、その命令にあった操作がなされます。このようにシェルはOSとユーザーとを内部的に繋ぐ仲介役として利用されています。
ポイント
- シェルとはOSとユーザーの仲介役
シェルの種類
シェルにも種類があり、種類によって使える機能やコマンドが異なります。
種類 | 特徴 |
---|---|
sh(Bourneシェル) | UNIXのシェル |
bash(Bourne Again Shell) | sh(Bourneシェル)を改良したシェル |
csh(Cシェル) | C言語に似たシェル |
ksh(Kornシェル) | sh(Bourneシェル)を拡張したシェル |
zsh(Zシェル) | kshにbashなどの機能を組み込んだシェル |
パソコンの中に組み込まれているシェルは機種にもよりますが、その中からデフォルトで操作するシェルを選択でき、コマンドラインを起動すると設定されているシェルも同時に起動されます。変更したい場合は設定やコマンドを実行することで変更することが可能です。
種類はたくさんありますが基本的な操作や機能などは共通です。シェルをより使いこなすために覚えておきたいコマンドや機能、仕組み、ショートカットなどをまとめていきたいと思います。
基本操作方法
シェルはCUIのコマンドラインとして操作していきます。つまり決められたコマンド(文字)を入力して実行することでOSが操作され任意の挙動を行わせることができます。
コマンドラインを起動するとシェルも起動され、入力待ち状態となり、プロンプトと呼ばれる待機状態を示す表示がでます。一般ユーザーの場合は「$
」、スーパーユーザー(root)と呼ばれる権限の強いユーザーの場合は「#
」が表示されるのが一般的です。プロンプトの表示形式は変更も可能です。初期設定はユーザー名とカレントディレクトリと記号($)が表示されていることが多いです。
プロンプトの例
ame current $
基本操作は文字を入力して操作します。メモ帳やテキストエディタなどのように矢印キー(→
/←
)でカーソルを移動させたり、backspace
キーで文字を削除することができ、コマンドを入力したらEnter
キーを押すことで実行できます。しかしbackspace
キーでの削除はカーソル位置ではなくカーソルの1つ左側を削除するので注意してください。
$ echo "文字列を表示" // Enterキーを押すと
文字列を表示 // コマンドが実行される
ポイント
- プロンプト:入力待ち状態で表示されている記号
- 一般ユーザーは「$」
- スーパーユーザーは「#」
- メモ帳やエディタのように文字を入力できる
ショートカットコマンドの種類
シェルにもいわゆるショートカットコマンドのようなもの(Ctrl+cでコピーなど)が用意されています。カーソルを一気に移動させるコマンドや削除するコマンド、処理を中断させるコマンドなどが用意されています。
コマンド | 役割 |
---|---|
Ctrl+a | 行頭へカーソルを移動 |
Ctrl+e | 末尾へカーソルを移動 |
Ctrl+d | カーソル部分を1文字削除 |
Ctrl+h | カーソルの左側を1文字削除 |
Ctrl+c | 処理を中断 |
Ctrl+z | 処理を一時停止 |
Ctrl+c
は間違えて実行した時などに処理中であれば処理を中断することができます。
コマンド履歴
シェルによっては実行したコマンドを履歴として残しておく機能が常設されています。履歴には矢印キーの↑
と↓
を使って参照できます。プロンプトが表示されている状態で↑
キーを押すと直近で実行された順番にコマンド履歴が、↓
キーでは履歴の古い順に遡ることができます。
history
コマンドを実行すると現在保存されている履歴一覧を表示させることができます。履歴には番号が振られており、!履歴番号
を入力してEnter
キーを押すとその履歴番号のコマンドを実行することができます。
$ history
988 php artisan serve
989 php artisan tinker
990 php artisan make:request TestPostRequest
991 php artisan serve
992 composer require laravel/ui
993 php artisan ui vue --auth
994 npm install
995 npm run dev
996 php artisan serve
997 composer update
998 php artisan serve
999 php artisan make:provider ExtendValidatorServiceProvider
1000 php artisan serve
1001 php artisan make:rule PosOnlyDot
1002 php artisan serve
1003 php artisan serve
履歴番号1000を実行する
$ !1000
php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
[Mon May 2 21:46:05 2022] PHP 8.0.12 Development Server (http://127.0.0.1:8000) started
それ以外にも!文字列
で履歴に該当するコマンドがあれば実行できたりといった機能も携わっています。
コマンド履歴は.bash_history
(※)ファイルに保存されていき、環境変数HISTSIZE
またはHISTFILESIZE
に設定されている値分だけ残されます。
コマンド | 役割 |
---|---|
↑ | 直前のコマンド |
↓ | 一番古いコマンド |
!履歴番号 | 履歴番号のコマンドを実行 |
!文字列 | 文字列と完全一致するコマンドを実行 |
!?文字列 | 文字列が含まれているコマンドを実行 |
‼︎ | 直前のコマンドを実行 |
history -c | 履歴をリセット |
※:「.シェル名_history」はユーザーのホームディレクトリに配置されています。隠しファイル(.で始まる)となっているのでls
コマンドで表示させる場合はオプション-a
を指定します。
コマンド履歴のまとめ
- シェルでは実行したコマンドが履歴として保存される
- historyコマンドで履歴を参照
- ↑/↓キーで履歴を遡れる
- ホームディレクトリ直下の「.シェル名_history」に保存されていく
引用符の種類
シェルでは文字列を囲む引用符の種類によって挙動が異なります。
' ' (シングルクォーテーション)
シングルクォーテーションで囲むと中は全て文字列として認識され、変数やコマンドは展開されずにそのまま出力されます。
$ greeting='Hello!'
$ echo '$greeting'
$greeting
$ echo '$greeting World!'
$greeting World!
" " (ダブルクォーテーション)
ダブルクォーテーションで囲むと中にある変数が展開されて出力されます。
$ greeting='Hello!'
$ echo "$greeting"
Hello
$ echo "$greeting World!"
Hello World
中の変数を展開させずにただの文字列として認識させるには$
文字を\
を使ってエスケープさせればOKです。
$ echo "\$greeting"
$greeting
$ echo "\$greeting World"
$greeting World
` ` (バッククォーテーション)
バッククォーテーションで囲むと中にあるコマンドを実行した結果に変わり出力されます。
$ echo `date`
2022年 5月 2日 月曜日 21時14分13秒 JST
$ echo "今日の日付は"`date`
今日の日付は2022年 5月 2日 月曜日 21時15分50秒 JST
バッククォーテーションの中には展開(実行)させたいコマンドのみを記述します。文字列を入れ込むとcommand not found
となってしまうの注意してください。
また変数を囲んだ場合変数の中身は展開され、値がコマンドの場合はそのまま実行、値がコマンドでない場合は先ほどと同様にエラーになります。
$ test="date"
$ echo `$test`
2022年 5月 2日 月曜日 21時15分50秒 JST
引用符のまとめ
- ' ' (シングルクォーテーション)は中身を全て文字列とする
- " " (ダブルクォーテーション)は中身の変数を展開
- ` ` (バッククォーテーション)は中身のコマンドを実行
リダイレクト処理
コマンドには標準入力、標準出力、標準エラー出力の3つがあり、通常のコマンドでは引数として渡された値を標準入力として受け取り、その結果はシェル上に標準出力として表示されています。
$ echo "やっほー" // $ コマンド 引数(標準入力)
やっほー // 標準出力
シェルではこれらの出力や入力を切り替える「リダイレクト(</>)」や「パイプ(|)」が用意されています。
コマンド | 役割 |
---|---|
> | ファイルへ出力(上書き) |
>> | ファイルへ出力(追記) |
< | ファイルから入力 |
<< 終了文字 | 終了文字が現れるまで入力を受け付ける |
2> | ファイルへエラー出力(上書き) |
2>> | ファイルへエラー出力(追記) |
1>&2 | 標準出力をエラー出力にリダイレクト |
2>&1 | エラー出力を標準出力にリダイレクト |
> ファイル 2>&1 | ファイルへ出力とエラー出力(上書き) |
>> ファイル 2>&1 | ファイルへ出力とエラー出力(追記) |
&> | ファイルへ出力とエラー出力 |
| | 別コマンドへ標準出力を 標準入力として渡す |
>の使い方
>
を使うと標準出力を切り替えることができます。
// 「sample.txt」にechoの出力を記述する
$ echo "やっほー" > sample.txt
$ cat sample.txt // ファイルの中身を確認する
やっほー
>>の使い方
>
ではファイルを上書きしてしまい元のデータは失われてしまいますが、>>
を使うとファイルの末尾に追記させることができます。
// 「sample.txt」にechoの出力を追記する
$ echo "追記だよ" >> sample.txt
$ cat sample.txt // ファイルの中身を確認する
やっほー
追記だよ
<の使い方
<
を使うとファイルの値を標準入力として渡すことができるようになります。
// wcコマンドの引数に「sample.txt」を渡す
$ wc < sample.txt
2 3 26
<< 終了文字 (ヒアドキュメント)の使い方
<< 終了文字
(終了文字はなんでもOK)とすると指定した終了文字が出るまで入力を続けることができるようになります。終了文字はEOF
(End Of File)がよく使われています。
// ヒアドキュメントを使ってファイルの中身を記述する
$ cat > sample.txt << EOF
heredoc> ヒアドキュメント
heredoc> です
heredoc> EOF
$ cat sample.txt
ヒアドキュメント
です
| の使い方
|
(パイプ)は出力結果を別のコマンドに渡すことができます。ページャ機能のless
コマンドと一緒に使われることが多いです。
// 長い行数のファイルをページャを使って開く
$ cat long.txt | less
出力を消す常套句
標準出力やエラー出力を画面上にもファイルにも出力したくない場合は/dev/null
へ出力する方法が使われます。/dev/null
ファイルは入力された値を自動消去する特殊なファイルです。
// >標準出力やエラー出力を画面上にもファイルにも出力しない
$ echo "ss" > /dev/null 2>&1
teeコマンド
tee
コマンドは受け取った標準入力をファイルへ保存した後に、標準出力へも出力します。つまり1つの標準入力をファイルと標準出力の2つにT字型に分岐させることができるのがこのコマンドのメリットです。
例えば以下のコマンドは「sample.txt」にls -l
に実行結果を書き込む処理とシェル上に表示させる2つの処理を行なってくれます。
$ ls -l | tee sample.txt
total 88
drwxr-xr-x@ 7 user staff 224 9 6 2021 ACCESS
drwxr-xr-x 9 user staff 288 5 17 22:28 FTP
drwxr-xr-x 3 user staff 96 4 8 23:32 FileZilla.app
-rw-r--r--@ 1 user staff 648 2 24 06:17 MAMP
drwxr-xr-x@ 12 user staff 384 12 3 18:21 SwiftUI
drwxr-xr-x 28 user staff 896 4 1 22:10 laravelapp
-rwsr-sr-x@ 1 user staff 0 5 18 06:23 sample.txt
また標準出力に分岐させただけですので他コマンドの引数(標準入力)として渡すことも可能です。
$ ls -l | tee sample.txt | sort
-rw-r--r--@ 1 user staff 648 2 24 06:17 MAMP
-rwxr-xr-x@ 1 user staff 538 5 18 06:29 sample.txt
drwxr-xr-x 3 user staff 96 4 8 23:32 FileZilla.app
drwxr-xr-x 9 user staff 288 5 17 22:28 FTP
drwxr-xr-x 28 user staff 896 4 1 22:10 laravelapp
drwxr-xr-x@ 7 user staff 224 9 6 2021 ACCESS
drwxr-xr-x@ 12 user staff 384 12 3 18:21 SwiftUI
total 88
デフォルトではファイルへ上書きして保存しているので-a
オプションを指定すれば追記させることも可能です。
$ ls -l | tee -a sample.txt | sort
-rw-r--r--@ 1 user staff 648 2 24 06:17 MAMP
-rwxr-xr-x@ 1 user staff 538 5 18 06:29 sample.txt
drwxr-xr-x 3 user staff 96 4 8 23:32 FileZilla.app
drwxr-xr-x 9 user staff 288 5 17 22:28 FTP
drwxr-xr-x 28 user staff 896 4 1 22:10 laravelapp
drwxr-xr-x@ 7 user staff 224 9 6 2021 ACCESS
drwxr-xr-x@ 12 user staff 384 12 3 18:21 SwiftUI
total 88
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。