Linuxの基礎入門（二）

みなさん、こんにちは、夏です。

私の知識をみんなと共有していきます。日本語のレベルはまだまだですが、ブログを書くことで日本語のスキルを上げることができますし、知識を共有できるのでとても嬉しいです。新しい友達を作ることを楽しみにしています。よろしくお願いします。

# 概要
* ユーザー 
* ターミナル 
* シェルの紹介 
* コマンドの実行 
* 簡単なコマンド 
* タブキー補完 
* コマンドラインの履歴 
* bashのショートカットキー 
* ヘルプの使用法

## 1.6 コマンドの実行
### 1.6.1 コマンド実行処理
コマンドを入力して Enter キーを押すと、入力されたコマンドに対応する実行可能プログラムまたはコードを検索し、分析してカーネルに送信して、実行するためのリソースを割り当てるようにシェル プログラムに指示します。
### 1.6.2 シェルで実行できる2種類のコマンド
+ 内部コマンド: シェルに付属し、特定のコマンドの形式で提供され、ユーザーのログイン後に自動的にロードされ、メモリに常駐します。
+ 外部コマンド: ファイルシステムパス上に対応する実行可能プログラムファイルがあり、コマンドを実行するとディスクからメモリにロードされ、実行後にメモリから削除されます。
tty コマンドは現在の端末を表示できます
```bash:shell
#type COMMAND
type ls  #内部コマンドか外部コマンドかを区別する
type -t echo #省略形、タイプのみが指定されます builtin｜alias｜file|keyword
type -a echo #すべてをリストします。同時に内部コマンドまたは外部コマンドである可能性があります
bash -c help #bash 内のすべてを表示します (内部コマンドだけでなく)

#例: 対応する内部コマンドと外部コマンドがあるかどうかを確認する
[root@rokcy8 ~]# type echo 
echo is a shell builtin
[root@rokcy8 ~]# type -a echo 
echo is a shell builtin
echo is /usr/bin/echo
```
:::note info
+ 内部コマンドと外部コマンドがありますが、すべてのホストが標準シェルを使用しているわけではないため、一般的に使用される内部コマンドには、内部コマンドの実行失敗を防ぐために外部コマンドのバックアップが用意されています。
+ コマンドが実行されると、シェルはまずそれが内部コマンドであるかどうかを判断し、内部コマンドである場合は内部コマンドを実行し、そうでない場合は特定のディレクトリで外部コマンドを検索します。
+ bash シェル自体は、多くの小さなツールが組み込まれたプログラムであり、ユーザーがターミナル経由でホストに接続すると、ターミナルではバックグラウンドで bash が実行されます。
:::
#### 1.6.2.1 内部コマンド関連
```bash:shell
help  #すべての内部コマンドとヘルプを表示する
enable   #有効な内部コマンドをすべて表示
enable cmd  #cmd コマンドを有効にする
enable -n cmd #内部 cmd コマンドを無効にする
enable -n   #無効化されたすべての内部コマンドを表示
```
#### 1.6.2.2 外部コマンドの実行
```bash:shell
#外部コマンド パスを確認
which  -a |--skip-alias 
whereis

#例
[root@rokcy8 ~]# which ls 
alias ls='ls --color=auto'
/usr/bin/ls

#エイリアスをスキップ
[root@rokcy8 ~]# which --skip-alias ls
/usr/bin/ls

# -a は、すべてのパスで一致するコマンドを検索することを意味します。デフォルトでは、最初に見つかったコマンドのみが一致します。
[root@rokcy8 ~]# which -a echo
/usr/bin/echo

#パスを表示する
[root@rokcy8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


#ルート直下にbinディレクトリを作成します
[root@rokcy8 ~]# mkdir bin

#echo コマンドを /root/bin/ ディレクトリにコピーします。
[root@rokcy8 ~]# cp /usr/bin/echo /root/bin/

#再度表示
[root@rokcy8 ~]# which echo
/usr/bin/echo

[root@rokcy8 ~]# which -a echo
/usr/bin/echo
/root/bin/echo

#外部コマンド検索パス
#root
[root@rokcy8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@rokcy8 ~]# su - mooreyxia
[mage@rokcy8 ~]$ echo $PATH
/home/mooreyxia/.local/bin:/home/mooreyxia/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/us r/sbin
```
##### 1.6.2.2.1 ハッシュキャッシュ(Hash)テーブル
+ システムの初期ハッシュ テーブルは空です。外部コマンドが実行されると、デフォルトでコマンドは PATH パスで検索されます。見つかったコマンドのパスはハッシュ テーブルに記録されます。コマンドが再度使用されるときは、コマンドのパスがハッシュ テーブルに記録されます。 , シェルインタプリタはまずハッシュテーブルを確認し、存在する場合は実行します、存在しない場合はPATHパスから検索します ハッシュキャッシュテーブルを使用するとコマンドの呼び出し率が大幅に向上します。
+ ハッシュは現在のユーザーの現在の端末プロセスに対してのみ有効であり、一時データのセットです。ユーザーを切り替えた後は無効です。ログアウトして再度ログインするとリセットされます。

 ハッシュコマンドの一般的な使用法:
```bash:shell
hash   #現在のターミナルプロセスのハッシュキャッシュを表示します
hash -l  #このハッシュを作成するコマンドを詳細に表示します。これは入力として使用できます。
hash -p path name  #ハッシュを手動で作成する
hash -t name  #パス出力
hash -d name  #指定したハッシュを削除する
hash -r  #すべてのハッシュをクリア

#例
[root@rokcy8 ~]# hash
hits    command
1　　　　/usr/bin/rm  
1   　　/usr/bin/cat  
3 　　　/usr/bin/ls

[root@rokcy8 ~]# hash -l 
builtin hash -p /usr/bin/rm rm 
builtin hash -p /usr/bin/cat cat 
builtin hash -p /usr/bin/ls ls 
builtin hash -p /usr/bin/su su

#ハッシュを手動で作成する
[root@rokcy8 ~]# builtin hash -p /abc abc 
[root@rokcy8 ~]# hash 
hits    command
1　　　　/usr/bin/rm  
1　　　　/usr/bin/cat  
0　　　　/abc
3　　　　/usr/bin/ls

#パス出力
[root@rokcy8 ~]# hash -t rm 
/usr/bin/rm

#指定されたハッシュを削除します
[root@rokcy8 ~]# hash -d rm

#すべてのハッシュをクリアする
[root@rokcy8 ~]# hash -r
```
### 1.6.3 コマンドのエイリアス
頻繁に実行される長いコマンドの場合は、実行を容易にするために、コマンドを短いエイリアスに定義できます。
```bash:shell
alias  #現在のシェルプロセスで使用可能なすべてのコマンドエイリアスを表示します
alias name #指定されたエイリアスを表示する
alias NAME='VALUE' #エイリアス NAME を定義します。これは、コマンド VALUE を実行するのと同じです。
unalias  #エイリアスを元に戻す

#すべてのエイリアスをリストする
[root@rokcy8 ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto' 
alias fgrep='fgrep --color=auto' 
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto' 
alias ll='ls -l --color=auto'

#指定されたエイリアスを表示する
[root@rokcy8 ~]# alias ls
alias ls='ls --color=auto'

#エイリアスの定義
[root@rokcy8 ~]# alias cdnet='cd /etc/sysconfig/network-scripts/' 
[root@rokcy8 ~]# cdnet
[root@rokcy8 network-scripts]# 

#エイリアスを取り消す
[root@rokcy8 ~]# unalias cdnet
[root@rokcy8 ~]# cdnet
bash: cdnet: command not found...

#すべてのエイリアスを取り消す
[root@rokcy8 ~]# unalias -a
[root@rokcy8 ~]# alias
[root@rokcy8 ~]# 

#例: 新しく追加されたディスクをスキャンする
[root@rocky8 ~]# alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - > /sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'
```
:::note info
コマンドラインで定義されたエイリアスは、現在のシェルプロセスに対してのみ有効です。

永続的に有効にする必要がある場合は、構成ファイルを作成する必要があります:
+ 現在のユーザーのみ：~/.bashrc 
+ すべてのユーザーに有効：/etc/bashrc

構成ファイルの編集によって追加された新しいエイリアスはすぐには有効になりません。

ログアウトして再度ログインするか、現在のプロセスで構成ファイルを再度読み取る必要があります:
+ source /path/to/config_file 
+ . /path/to/config_file

コマンド実行優先度
+ エイリアス -----> 内部コマンド ------> 外部コマンド
:::
同名コマンドの実行の違い
```bash
[root@rokcy8 ~]# alias ls alias ls='ls --color=auto'

#エイリアスを実行する
[root@rokcy8 ~]# ls

#ネイティブコマンドを実行する
[root@rokcy8 ~]# \ls
[root@rokcy8 ~]# /usr/bin/ls
```