【Linux】シェルの使い方-基本構文/コマンド履歴/引用符/リダイレクト

この記事からわかること

  • Linuxコマンドとは?
  • 基本的なシェル使い方操作方法
  • 機能ショートカット
  • 基本構文/コマンド履歴/引用符/リダイレクト
  • historyteeコマンド

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

シェルとは?

シェルとはパソコンを制御しているソフトウェア(OS)と利用するユーザーとを繋ぐ機能のことです。パソコンを操作する際マウスなどを使って操作する方法をGUI(Graphical User Interface)、文字(コマンド)入力を行い操作することをCUI(Character User Interface)と言います。

CUIの種類の1つが「コマンドライン」です。WindowsのコマンドプロンプトやMacのターミナルがコマンドラインとして操作するためのアプリケーションとして提供されています。

コマンドラインに任意のコマンドを打ち込み実行するとシェルがそのコマンドを読み込んだ後内部的に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を指定します。

コマンド履歴のまとめ

引用符の種類

シェルでは文字列を囲む引用符の種類によって挙動が異なります。

' ' (シングルクォーテーション)

シングルクォーテーションで囲むと中は全て文字列として認識され、変数やコマンドは展開されずにそのまま出力されます。

$ 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

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index