Closed20

『新しいLinuxの教科書』を読む

yoshinoyoshino

Chapter01 Linuxを使ってみよう

  • 狭義のLinux:Linuxカーネル=OSの中核となる部分
  • 広義のLinux:Linuxカーネルに加えて基本的なコマンド群やアプリケーションを含めた、Linuxディストリビューション
    • Red Hat系:Red Hat Enterprise Linux, CentOS, Fedora
    • Debian系:Debian GNU/Linux, Ubuntu
  • LinuxはUNIX系のOS。MacOSはUNIX系に近いOSなので、シェルで共通のコマンドが使えたりする。
$ docker pull centos:centos7
$ docker run -it --name linux_example centos:centos7
# -it コンテナのプロセスにttyを割り当てる
# -d コンテナをバックグラウンドで実行する
# --name 作成するコンテナに名前をつける
# exitでbashシェルの終了とともにコンテナも起動終了
$ docker start -i linux_example
docker startコマンドでtが要らない理由

-i オプションは、コンテナの標準入力を開き、インタラクティブモードでコンテナを起動します。これにより、コンテナ内のプロセスと対話できるようになります。
一方、 -t オプションは疑似ターミナル(TTY)を割り当てる意味があります。通常、 -i と -t は組み合わせて使われ、 docker run -it のようにコンテナを新規に起動する際に使われます。これにより、コンテナ内で実行されるプロセス(シェルなど)にターミナルを割り当てることができます。
しかし、 docker start コマンドは、既に作成済みの停止中のコンテナを起動するためのコマンドです。このコンテナは、元々 docker run -it で起動されていたため、既にターミナルが割り当てられています。
そのため、 docker start の際には改めて -t オプションでターミナルを割り当てる必要がなく、 -i オプションでコンテナの標準入力を開くだけで、コンテナ内のプロセスと対話できるようになります。
つまり、 docker start -i だけで、停止中のコンテナを起動し、アタッチすることができるため、 -t オプションは不要なのです。

https://www.sejuku.net/blog/86137

  • CLIのメリット
    • パイプを使ったプログラム連携がしやすい
    • 処理の自動化がしやすい
  • rootユーザ(スーパーユーザ):プロンプトの記号が#
  • それ以外(一般ユーザ):$
Docker上で起動したCentOSがshutdownコマンドでシャットダウンできない理由

Dockerコンテナは、ホストOSのカーネルを共有するため、shutdown コマンドはホストOSのシャットダウンを試みますが、Dockerコンテナはホストとは分離された環境なので、コンテナ内部からホストOSの操作はできません。そのため、コンテナのシャットダウンはホストOSから行う必要があるのです。

  • 業務用サービスを提供するLinuxサーバはめったなことではシャットダウンしない。
yoshinoyoshino

Chapter02 シェルって何だろう?

  • echo:コマンドの後ろに指定した文字列を表示する
  • Linux内部でコマンドが実行される仕組み
    • キーボードから入力されたdateという文字列を受け取る -- シェル
    • dateという名前のコマンドを探す -- シェル
    • 見つかったコマンドを実行する -- Linuxカーネル
    • 実行した結果として得られた日時の文字列を画面に表示する -- シェル
  • シェルはLinuxカーネルを包み込むように動作する。シェル=殻
  • ログインシェル(=ログイン時に自動的に起動するシェル)の確認:echo $SHELL
  • シェルスクリプト:実行したいコマンド群を記述したファイル
  • シェルの種類
    • sh:古い。シェルスクリプトを書く際に使われる。対話的に使うには不向き。
    • csh:shに対話型操作が便利になる機能を追加したシェル。現在ではほぼ使われない。
    • bash:shを拡張したシェル。多くのLinux環境でデフォルトのログインシェルになっている。
    • tcsh:cshの後継。昔のMacOSのログインシェル。
    • zsh:新しい。高機能。現在のMacOSのログインシェル。
  • shコマンドやbashコマンドでシェルを多重に起動できる
[root@20c4880526c1 /]# sh
sh-4.2# bash
[root@20c4880526c1 /]# exit
exit
sh-4.2# exit
exit
[root@20c4880526c1 /]#
  • ターミナル=端末。ユーザがコンピュータへ入出力する際に利用するハードウェアのことを指す。MacOSのターミナルとは、物理的なターミナルをソフトウェアによって実装したターミナルエミュレータ。
  • LinuxカーネルはGNU GPLというライセンスを採用している。このライセンスは、プログラムを改変して配布する際にも同一のライセンス(GNU GPL)で配布しなければならないという強い制約がある。

https://ja.wikipedia.org/wiki/GNU_General_Public_License

yoshinoyoshino

Chapter03 シェルの便利な機能

  • Ctrl + b:カーソル後退。back
    • Esc + b:カーソルを単語ごとに後退。
  • Ctrl + f:カーソル前進。forward
    • Esc + f:カーソルを単語ごとに前進。
  • Ctrl + a:カーソルを行頭へ。all
  • Ctrl + e:カーソルを行末へ。end
  • Ctrl + d:カーソルがある文字を削除。
  • Ctrl + w:単語ごと削除。カーソル位置から後方に向かって、スペースが現れるまでの文字列を削除
  • Ctrl + u:カーソル位置から行頭までをカット
  • Ctrl + y:最後にカットした内容をペースト(ヤンク)
  • Ctrl + s:画面表示をロックする
  • Ctrl + q:画面表示のロックを解除する
    • キーボードからの操作を受け付けなくなったらまず試してみる。
  • Ctrl + c:実行中のコマンドを強制終了する。
    • コマンドラインの途中まで入力したところで、現在の入力内容を破棄して新しいコマンドラインに移りたいときにも使える。
  • Ctrlキーの入力は^記号で表現される。
  • Tabキーを2回押すとコマンドのリストが表示される。
[root@20c4880526c1 /]# e
echo     eject    elif     enable   esac     ex       exit     export
egrep    elfedit  else     env      eval     exec     expand   expr
  • Ctrl + p:コマンド履歴を戻る。previous
  • Ctrl + n:コマンド履歴を進む。next
yoshinoyoshino

Chapter04 ファイルとディレクトリ

  • Linuxのディレクトリ構成はFHS(Filesystem Hierarchy Standard)という標準化仕様に基づいている。

https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

  • /bin:一般ユーザおよび管理者ユーザの両方が利用するコマンドの実行ファイルのディレクトリ。
  • /dev:ディスクやキーボードなどのハードウェアをファイルとして扱うためのデバイスファイルのディレクトリ。
  • /etc:アプリケーションやLinux自体のコンフィグ(=設定)ファイルのディレクトリ。
  • /home:ユーザーごとに割り当てられるホームディレクトリ。
  • /sbin:管理者ユーザ向けのコマンドの実行ファイルのディレクトリ。
  • /tmp:一時的なファイルを置くためのディレクトリ。
  • /usr:アプリケーションとそれに付随するファイルを置くためのディレクトリ。追加でアプリケーションをインストールした際に、実行ファイルやドキュメント、ライブラリなどがこのディレクトリの下に配置される。サブディレクトリとしてbin、sbin、etcなどを持つ。
  • /var:ログファイルなど変化するデータを置くためのディレクトリ。容量逼迫の原因になることが多い。
[root@20c4880526c1 /]# cd ~ # ~(チルダ)はホームディレクトリに置き換えられる
[root@20c4880526c1 ~]# pwd
/root
[root@20c4880526c1 /]# cd bin
[root@20c4880526c1 bin]# ls a* # *はワイルドカード 
addr2line  alias  ar  arch  as  awk
[root@20c4880526c1 bin]# ls a? # ?は任意の一文字
ar  as
[root@20c4880526c1 bin]# ls -l # 詳細情報を表示
# ファイルタイプの先頭が-だと通常ファイル、dだとディレクトリ、|だとシンボリックリンク
total 52272
-rwxr-xr-x 1 root root   70136 Aug 13  2019 [
-rwxr-xr-x 1 root root   70048 Oct  1  2020 addr2line
-rwxr-xr-x 1 root root      29 Apr  1  2020 alias
-rwxr-xr-x 1 root root   70768 Oct  1  2020 ar
-rwxr-xr-x 1 root root   69928 Aug 13  2019 arch
-rwxr-xr-x 1 root root  408200 Oct  1  2020 as
lrwxrwxrwx 1 root root       4 Nov 13  2020 awk -> gawk
-rwxr-xr-x 1 root root   70112 Aug 13  2019 base64
-rwxr-xr-x 1 root root   69968 Aug 13  2019 basename
-rwxr-xr-x 1 root root  971768 Apr  1  2020 bash
...
[root@20c4880526c1 bin]# ls -a # 隠しファイルも表示
[root@20c4880526c1 bin]# ls -F # ファイル種別も表示
# 通常ファイルは記号なし、ディレクトリは/、実行可能ファイルは*、シンボリックリンクは@が末尾につく
[*                                   id*                setfacl*
addr2line*                           idn*               setpriv*
alias*                               igawk*             setsid*
ar*                                  info*              setterm*
arch*                                infocmp*           setup-nsssysinit@
as*                                  infokey*           setup-nsssysinit.sh*
...
  • コマンドのオプションが先、引数が後
$ ls -aF /
  • --で指定するオプションはロングオプション。長い名前で指定するオプション。
# 下記2つは同じ
$ ls --width 30
$ ls -w 30
yoshinoyoshino

Chapter05 ファイル操作の基本

# mkdir:ディレクトリ作成
# -pオプションで深いディレクトリを一気に作成する
[root@20c4880526c1 work]$ mkdir -p report/2014/01
# touch:ファイル作成
[root@20c4880526c1 work]$ touch newfile
# rm:ファイル削除
[root@20c4880526c1 work]$ rm newfile
# *も使える
[root@20c4880526c1 work]$ touch test.html test2.html
[root@20c4880526c1 work]$ rm *.html
# -rオプションで再帰的にディレクトリツリーを削除する
[root@20c4880526c1 work]$ mkdir dir1
[root@20c4880526c1 work]$ touch dir1/file1 dir1/file2 dir1/file3
[root@20c4880526c1 work]$ rm -r dir1
# rmdir:空のディレクトリ削除
[root@20c4880526c1 work]$ mkdir dir1
[root@20c4880526c1 work]$ rmdir dir1
# cat:ファイルの表示。catはconcatenate(連結)
# -nオプションで行番号を表示
[root@20c4880526c1 work]$ cat /etc/hostname
     1	20c4880526c1
# cp:ファイル、ディレクトリのコピー
# コピー先に同じ名前のファイルがある場合は上書きされる
[root@20c4880526c1 work]$ touch file1
[root@20c4880526c1 work]$ cp file1 file2
# file1とfile2をdir2/にコピー
[root@20c4880526c1 work]$ mkdir dir2
[root@20c4880526c1 work]$ cp file1 file2 dir2
# -rオプションで再帰的にディレクトリツリーをコピーする
[root@20c4880526c1 work]$ cp -r dir2 dir3
# mv:ファイルの移動
# ファイル名の上書き
[root@20c4880526c1 mvtest]$ touch file1
[root@20c4880526c1 mvtest]$ mv file1 file2 # file1をfile2という名前にして同じディレクトリに移動。file1は消える。
[root@20c4880526c1 mvtest]$ mkdir dir1
[root@20c4880526c1 mvtest]$ mv file2 dir1 # file2をdir1/に移動。元のfile2は消える。
# ディレクトリを移動させる際は-rオプション不要
[root@20c4880526c1 mvtest]$ mv dir1 dir2
  • リンク
    • ハードリンクとシンボリックリンクがある。シンボリックリンクを基本的に使う。WindowsのショートカットやMacOSのエイリアスと似た機能。
    • シンボリックリンクはlatestというパスなどで使われている。
[root@20c4880526c1 work]$ cp /etc/hostname file1
# ln -sでシンボリックリンク作成
[root@20c4880526c1 work]$ ln -s file1 file2
[root@20c4880526c1 work]$ ls -l
total 4
-rw-r--r-- 1 root root 13 Apr  5 11:30 file1
lrwxrwxrwx 1 root root  5 Apr  5 11:32 file2 -> file1
[root@20c4880526c1 work]$ cat file2 # file1を参照している
20c4880526c1
[root@20c4880526c1 work]$ rm file1
[root@20c4880526c1 work]$ cat file2 # リンク先がなくなっているので、リンクが壊れた状態
cat: file2: No such file or directory
yoshinoyoshino

Chapter06 探す、調べる

[root@20c4880526c1 work]$ mkdir -p dir1/doc
[root@20c4880526c1 work]$ touch file-1.txt file-2.txt dir1/doc/file-1.txt
# find:ファイルを探す
# find [検索開始ディレクトリ] [検索条件] [アクション]
# -nameでファイル名で探す(大文字小文字を区別しないときは-iname)
# -printでパス名を表示
[root@20c4880526c1 work]$ find . -name file-1.txt -print
./file-1.txt
./dir1/doc/file-1.txt
# ワイルドカードを使うときは''で囲む
[root@20c4880526c1 work]$ find . -name '*.txt' -print
./file-2.txt
./file-1.txt
./dir1/doc/file-1.txt
# -typeでファイルの種類で探す。-type fでファイル、-type dでディレクトリ。
[root@20c4880526c1 work]$ find . -type d -print
.
./dir1
./dir1/doc
# 検索条件を並べて書くとAND検索になる
  • locate:パスの一部を指定してファイルを探す。初期状態のLinuxには入っていないコマンド。
    • 事前に作成されたファイルパスのデータベースを検索するため、高速に動作する
    • ファイルパスのデータベースは1日1回作成される
      • システムにあらかじめインストールされているファイルや昔作ったファイルを検索するのに向いている

  • コマンドの使い方を調べる
    • [コマンド名] --help
      • MacOSでは使えなかった
    • man [コマンド名]
      • マニュアルの表示。--helpより詳しい。
      • Dockerで動かしているCentOSにはインストールされていなかったが、MacOSにはインストールされていた。
      • qで終了
      • man -k [キーワード]:キーワードで調べる

  • シェルがコマンドを実行する際、$PATHという環境変数に設定された場所から自動的にコマンドを探す
    • $PATHで指定されたリストの前方から順番に探す
    • コマンドを入力するとき、シェルが実際にどのファイルを実行するかを確認したいときはwhichコマンドを使う
[root@20c4880526c1 work]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@20c4880526c1 work]$ which cat
/usr/bin/ca
  • Linuxのマニュアルの日本語化プロジェクト

https://linuxjm.sourceforge.io/

yoshinoyoshino

Chapter07 テキストエディタ

  • ファイル
    • テキストファイル
      • Linuxの設定ファイル
    • バイナリファイル
      • 画像ファイル、音声ファイル、Linuxコマンドの実行ファイル
  • Vim=Linuxの標準エディタ
  • vimのインストール
$ yum install vim
  • vi [ファイル名]またはvim [ファイル名]:vim起動
    • 既存のファイルを開くか、新しいファイルを作成する
  • :q:vimを終了
    • :q!:変更を無視して終了
  • :w:上書き保存
  • カーソルの移動:hjklで←↓↑→
    • wで次の単語に移動、bで前の単語に移動
    • 0で行頭に移動、$で行末に移動
    • ggで1行目、Gで最終行、[行数]Gで指定した行数に移動
  • iまたはa:インサートモードに
    • aは行末に入力したいとき
    • xで文字を削除
  • Esc:ノーマルモードに
  • d[カーソル移動コマンド]:カット(デリート)
    • 例えば現在位置から行末までカットしたい場合はd$
  • y[カーソル移動コマンド]:コピー(ヤンク)
  • p:ペースト(プット)
  • u:アンドゥ
  • Shift + r:リドゥ
  • J:下の行と連結。
  • /[検索ワード]:検索。nで次の検索結果にジャンプ
  • :%s/[置換文字列]/[置換後文字列]/g:置換
yoshinoyoshino

Chapter08 bashの設定

  • エイリアス
    • エイリアスの設定:$ alias ls = 'ls -F'
    • エイリアスの確認:$ type ls
    • エイリアスの削除:$ unalias ls
    • エイリアスを一時的に無効にする:$ \lsまたは$ command ls
  • シェル変数:bash内部で使用される変数
    • シェル変数の設定:$ var1='test variable'
    • シェル変数の参照:$ echo $var1
      • 特別なシェル変数
        • PS1:プロンプト設定
        • PATH:コマンド検索パス
        • LANG:ロケール
    • コマンドには実行ファイルがファイルシステム上に存在する外部コマンドと、シェル自体に内蔵されている組み込みコマンドがある。外部コマンドからも参照できるようにしたシェル変数を環境変数と呼ぶ。
      • $ printenv:環境変数の表示
      • $ export [シェル変数]:指定したシェル変数を環境変数にする。例:$ export LESS='--no-init'`
  • bashの設定ファイル
    • bashの起動時に、/etc/profile(システム全体の設定)、~/.bash_profile(ログイン時の設定)、~/.bashrc(bash起動時の設定)の3つの設定ファイルが順に読み込まれる。
    • カスタマイズしたい際は.bashrcに書けばOK。
    • カスタマイズする前に元の.bashrcのコピーをとっておく。
    • $ source ~/.bashrcで変更を即座に反映

https://zenn.dev/shink32/articles/19549c4c2bc543

yoshinoyoshino

Chapter09 ファイルパーミッション、スーパーユーザ

  • Linuxの全てのファイルにオーナーが設定されている。
    • ファイルのオーナーは$ ls -lコマンドで確認できる。
    • 下記の例だと、rootがオーナー、wheelがファイルの所属するグループ
$ ls -l /bin/cat
-rwxr-xr-x  1 root  wheel  135408  8  2  2023 /bin/cat
  • ユーザーは必ず1つ以上のグループに所属している。
    • groupsコマンドで自分が現在のどのグループに所属しているか確認できる。
    • ファイルが所属するグループは、デフォルトではファイルのオーナーのメイングループになるが、あとから変更することもできる。
$ groups
staff everyone ...
  • ファイルのパーミッションも$ ls -lで確認できる。

    • -rwxr-xr-xの場合
      • 先頭1文字がファイルタイプ。-が通常ファイル、dがディレクトリ、lが新堀区リンク
      • 次の3文字がオーナーに対するパーミッション
        • rが読み込み、wが書き込み、xが実行。-が権限なし。
      • 次の3文字がグループに対するパーミッション
      • 最後の3文字がその他のユーザーに対するパーミッション
  • ディレクトリのパーミッションは$ ls -ldで確認できる。

    • rが読み取り(ファイル一覧の取得)、wが書き込み(ファイル・ディレクトリの作成・削除)、xが実行(ディレクトリをカレントディレクトリにする)
      • ファイルを削除できるかどうかはファイルのパーミッションではなくディレクトリのパーミッションで決まる。
  • chmodコマンド:パーミッションを設定する

    • ファイルやディレクトリのパーミッションは、そのオーナーかスーパーユーザしか変更できない。
    • シンボルモード:$ chmod [ugoa][+-=][rwx] [ファイル名]
      • uがオーナー、gがグループ、oがその他のユーザー、aがugoすべて
      • $ chmod u+w file.txtで、オーナーに書き込み権限を追加する。
      • パーミッションの一部だけを変更したい時に便利。
    • 数値モード:$ chmod [8進数の数値] [ファイル名]
      • $ chmod 755 file.txtで、7=421=rwx、5=401=r-xなので、rwxr-xr-xというパーミッションに変更する。
  • スーパーユーザ=rootユーザ

    • 強い権限を持つ
    • 通常は一般ユーザでログインして操作し、必要なときだけスーパーユーザとして作業するべき。
$ ls -l /private/etc/master.passwd
-rw-------  1 root  wheel  8749  8  2  2023 /private/etc/master.passwd
$ cat /private/etc/master.passwd # ユーザーに読み取り権限がない
cat: /private/etc/master.passwd: Permission denied
$ sudo cat /private/etc/master.passwd #sudo:スーパーユーザとしてcatコマンドを実行
Password: # 現在のユーザーのパスワードを入力する
# ファイルの内容が表示される
  • どのユーザにsudoコマンドの実行権限を持たせるかどうかの設定は/etc/sudoersファイルで管理されている。
    • /etc/sudoersを編集するときはvisudoコマンドを使う。
  • suコマンドよりsudoコマンドを使うべき。

https://qiita.com/KoyanagiHitoshi/items/318d4b8ef3b4e5b87390

yoshinoyoshino

Chapter10 プロセスとジョブ

  • プロセス:メモリ上で実行状態にあるプログラム
    • Linuxカーネルは、1つ1つのプロセスにプロセスIDを割り振って管理している。
    • プロセスが新しく作られるときは、すでに存在している別のプロセスを元に作成される。
      • シェルからlsコマンドを実行すうと、シェルが親プロセス、lsコマンドのプロセスが子プロセスとなる。
# psコマンドでプロセスを表示
# PIDがプロセスID、TTYがターミナル、CMDが実行中のコマンド
[root@20c4880526c1 work]$ ps
  PID TTY          TIME CMD
    1 pts/0    00:00:01 bash
  276 pts/0    00:00:00 ps
# よく使われるオプション
# x: psコマンドを実行したユーザのプロセスすべてを表示
# ax: 全てのユーザのプロセスを表示
  • ジョブ:シェルから見た処理の単位
    • シェルごとにジョブ番号を持つ
    • シェルからジョブを一時停止させたり、バックグラウンドで実行させたりできる。
$ man zsh # ctrl + zで中断
zsh: suspended  man zsh
$ vim ~/.zshrc # ctrl + zで中断
zsh: suspended  vim ~/.zshrc
# jobs:ジョブ一覧を確認
# -lでプロセスIDも表示
$ jobs -l
[1]  - 81191 suspended  man bash
[2]  + 81400 suspended  vim ~/.zshrc
# fg:ジョブをフォアグラウンド(=対話可能な状態)で再開
# 1番のジョブを再開
$ fg %1
[1]  - continued  man bash
# bg:ジョブをバックグラウンドで再開
# &:はじめからジョブをバックグラウンドで実行する
$ cp file1 file2 &
# kill:ジョブ・プロセスの終了
$ kill %1
$ kill 4654
  • killコマンドは「シグナルを送信する」コマンド
    • プロセスは受け取ったシグナルの種類によって「終了」「停止」「再起動」など状態が変わる。
    • シグナル名を省略するとTERM(=Terminate、終了)というシグナルを送信する。
    • killコマンドで利用可能なシグナル一覧は$ kill -lで確認できる。
      • KILLシグナルは強制終了。まずはTERMシグナルを試す。
$ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2
yoshinoyoshino

Chapter11 標準入出力とパイプライン

  • 標準入力(stdin):通常はキーボード
  • 標準出力(stdout):通常は端末ディスプレイ
  • 標準エラー出力(stderr):通常は端末ディスプレイ
  • catコマンドは標準入力の内容を読み込んで、標準出力にそのまま出力するコマンド
    • <でキーボードの代わりにファイルを標準入力につなぐ=標準入力のリダイレクト
$ cat < ~/.zshrc
# ~/.zshrcの内容が表示される
# <を使わない、cat ~/.zshrcというコマンドは「引数にファイル名が指定された場合にはその内容を対象とする」動作を利用している
  • 標準出力、標準エラー出力のリダイレクト
$ ls -l > list.txt
# >>でファイルの末尾に追記する
$ ls -l >> list.txt
# 2>で標準エラー出力のリダイレクト
$ ls -l > list.txt 2> error.txt
# 標準エラー出力を標準出力にリダイレクト(result.txtに両方の出力が記録される)
$ ls -l > result.txt 2>&1
echoとcatの違い

echoコマンドとcatコマンドの主な違いは以下の通りです。
echoコマンド:
引数として渡された文字列を標準出力に出力する
標準入力は使わない
引数しか受け付けず、標準入力からの入力は受け付けない
catコマンド:
引数として渡されたファイルの中身を標準出力に出力する
引数がない場合は標準入力からの入力を標準出力に出力する
複数のファイルを引数に指定すると、それらの内容を連結して出力する
ファイルの内容を表示するだけで、ファイルの書き換えはできない

つまり、echoは文字列を出力するのに対し、catはファイルの内容を出力・連結するのが主な用途です。
また、echoは引数のみ受け付けるのに対し、catは引数と標準入力の両方を受け付けるという違いがあります。

  • /dev/null(スペシャルファイル)
    • 入力先として指定しても、何も内容を返さない
    • 出力先として指定しても、書き込んだデータはどこにも保存されずに消えて無くなる
# コマンドの表示結果が大量にあるが、エラーだけを読みたいとき
$ ls / /xxxx > /dev/null
ls: /xxxx: No such file or directory
# エラーが大量に出るが、コマンドの通常の出力結果だけを読みたいとき
$ ls / /xxxx 2> /dev/null
/:
Applications	Users		cores		home		sbin		var
Library		Volumes		dev		opt		tmp
System		bin		etc		private		usr
  • パイプライン
    • コマンドの標準出力を別のコマンドの標準入力につなぐ
# 1つ目のコマンドls -l / の標準出力が、2つ目のコマンドlessの標準入力になる
$ ls -l / | less
  • フィルタ:catコマンドのように、標準入力を入力として受け取って標準出力に出力するコマンド
    • cat:入力をそのまま出力する
    • head:先頭を表示する
    • grep:指定した検索パターンに一致する行だけを表示する
    • sort:順番に並べ替える
    • uniq:重複した行を取り除く
# du -k /bin/* 指定したファイルやディレクトリの使用容量を表示する。-kオプションでファイルサイズを表示。
# sort -nr ソートして表示。-nオプションで数値順、-rオプションで逆順に
# head 先頭を表示。-nオプションで行数指定
$ du -k /bin/* | sort -nr | head -n 5
1380	/bin/ksh
736	/bin/zsh
684	/bin/bash
528	/bin/csh
116	/bin/pax
yoshinoyoshino

Chapter12 テキスト処理

  • wc:入力ファイルの行数・単語数・バイト数を数える
    • wcコマンド含めて、フィルタのコマンドは、ファイル名を指定しないと標準入力から読み込む
$ wc /etc/passwd
     127     339    8164 /etc/passwd
# -lオプションで行数のみ表示
$ wc -l /etc/passwd
     127 /etc/passwd
  • sort:行単位でテキストをソートする
    • デフォルトは辞書順
# -kオプションを使って、第5フィールド(コマンド名)順で並び替え
$ ps x | sort -k 5
 3620 s000  Ss     0:00.38 -zsh -g --no_rcs
23623 s001  Ss     0:00.81 -zsh -g --no_rcs
42908   ??  S     18:42.30 /Applications/...
# -nオプションで、文字列を数値とみなして並べ替える
# -rオプションで、逆順にソート
  • uniq:連続した重複行を取り除く
    • 重複が連続していない場合は一度sortしてからuniqコマンドを使う
  • cut:入力行の一部分を切り出す
  • tr:文字を置換・削除する
  • tail:ファイルの末尾を表示する
    • デフォルトは10行分
$ touch output.log
# -fオプションでリアルタイム表示
# Ctrl + Cで終了
# Linuxの運用作業などでログファイルの監視によく使われる
$ tail -f output.log
  • diff:差分を表示する
    • -uオプションでユニファイド形式(=Gitの差分表示と同じ形式)に
    • 差分ファイル=パッチ
$ diff linux.txt.org linux.txt
1a2 # 1つ目のファイルの1行目のあとに、2つ目のファイルの2行目の内容が追加された
# 真ん中の英字はa:add、c:change、d:deleteのどれか
> test2
yoshinoyoshino

Chapter13 正規表現

  • grep [オプション] <検索パターン> <ファイル名>
    • ファイル名から検索パターンに一致する行を出力する
# -nで行番号表示
$ grep -n bash /etc/passwd
92:_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
# -iで大文字と小文字を区別せずに検索
$ grep -i system /etc/passwd
# Note that this file is consulted directly only when the system is running
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
# -vでマッチしなかった行を表示
$ grep -v bash /etc/passwd
...
# 対象のファイル名を指定しない場合は標準入力から読み込む
$ ls /etc | grep passwd
master.passwd
passwd
# 正規表現はシングルクォートで囲む
$ ls /etc | grep '^passwd'
passwd

基本正規表現

  • .:任意の1文字
    • t.stはtest、tfst、tzstなどにマッチ
    • ドットそのものを検索したいときは\.とする=エスケープ
  • []:特定の文字
    • t[ef]stはtestあるいはtfstとマッチ
    • [a-zA-Z]はアルファベットの大文字小文字すべてにマッチ
    • mail[^13]:mailのあとに1か3以外の文字があるものにマッチ
  • ^:行頭
    • ^netは行頭がnetという文字列にマッチ
  • $:行末
    • net$は行末がnetという文字列にマッチ
  • *:0回以上の繰り返し
    • Be*rはBr、Ber、Beerなどにマッチ
    • B[ea]*rはBr、Ber、Bar、Bear、Beerなどにマッチ
    • .*は任意の文字が0回以上繰り返されている=あらゆる文字列にマッチ

拡張正規表現

  • grepコマンドで拡張正規表現を使う場合は-Eオプションを使う
  • +:1回以上の繰り返し
    • Be+rはBer、Beer、Beeerなどにマッチ
  • ?:0回または1回の繰り返し
  • {m, n}:m回以上n回以下の繰り返し
    • Be{1, 2}rはBer、Beerにマッチ
    • Be{2}rはBeerにマッチ
    • [0-9]{3}-[0-9]{4}で郵便番号にマッチ
    • Be{4,}rはBeeeer、Beeeeerなどにマッチ
  • ():正規表現をグループ化
    • (Wine){2,}はWineWine、WineWineWineなどにマッチ
  • |:複数の正規表現をOR条件で連結
    • (Vodka|Wine)でVodkaまたはWineとマッチ
yoshinoyoshino

Chapter14 高度なテキスト処理

  • $ sed [オプション] <スクリプト> <対象ファイル>:文字列置換
    • Stream Editorの略
    • 非対話型エディタ
    • 編集結果を標準出力に出力するだけで、ファイルは上書きしない
$ cat drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine
# 2行目から5行目までを削除
# dが行を削除するコマンド
$ sed 2,5d drink2.txt
Ber
My Vodka
My Wine
# Bで始まる行を削除
# 正規表現は/で囲む
$ sed /^B/d drink2.txt
My Vodka
My Wine
  • sedコマンドは行を読み込むとまずパターンスペースにコピーし、パターンスペースに編集コマンドを実行してから、最後にパターンスペースの内容を出力する。
# pは行を表示するコマンド。1行目を表示する。
$ sed 1p drink2.txt
Ber # pコマンドによる出力
Ber # パターンスペースの出力、以下同
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine
# -nでパターンスペースを出力しない
$ sed -n 1p drink2.txt
Ber
# sは行を置換するコマンド
# s/置換前文字列/置換後文字列/フラグ
# フラグは省略可能
# Beerという文字列をWhiskyという文字列に置換(最初に見つかった文字列だけ)
$ sed 's/Beer/Whisky/' drink2.txt
Ber
Whisky
WhiskyBeer
WhiskyBeerBeer
Beeeeeeeeer!!!
My Vodka
My Wine
# gフラグで見つかったすべての文字列を置換
$ sed 's/Beer/Whisky/g' drink2.txt
Ber
Whisky
WhiskyWhisky
WhiskyWhiskyWhisky
Beeeeeeeeer!!!
My Vodka
My Wine
# 置換前文字列の指定に正規表現を利用
# 拡張正規表現を利用したい場合は-rオプションをつける
$ sed 's/B.*r/Whisky/g' drink2.txt
Whisky
Whisky
Whisky
Whisky
Whisky!!!
My Vodka
My Wine
# 後方参照。\(\)でグループ化し、\1で参照
$ sed 's/My \(.*\)/--\1--/' drink2.txt
Ber
Beer
BeerBeer
BeerBeerBeer
Beeeeeeeeer!!!
--Vodka--
--Wine--
  • awk:テキストの検索や抽出・加工などの編集操作を行う
    • sedよりも高機能
      • テキスト処理に特化したプログラミング言語とみなされている
    • $ awk <スクリプト> <対象ファイル>
      • awkのスクリプトはパターン{ アクション }で構成される
        • パターンはアクションを実行するかどうかの条件(省略可)
        • アクションには実際のテキスト編集処理を記述
$ ls -l /usr/bin/
total 162936
-rwxr-xr-x   1 root   wheel    204592  8  2  2023 AssetCacheLocatorUtil
...
# printは文字列を表示するアクション
# awkはレコード(各行)をスペースもしくはタブ区切りでフィールドに分割する
# $5,$9で、5番目のフィールド変数と9番目のフィールドをスペース区切りで表示する
$ ls -l /usr/bin/ | awk '{print $5,$9}'
204592 AssetCacheLocatorUtil
# NFはレコードのフィールド数が代入されている変数
# $NFをprintするとレコードの最後のフィールドが表示される
# アクション内部で演算(NF-1)もできる
$ ls -l /usr/bin/ | awk '{print $(NF-1),$NF}'
total 162936
2023 AssetCacheLocatorUtil
...
# パターンの指定
# 9番目のフィールドがcpで始まるレコードを対象とする
ls -l /usr/bin/ | awk '$9 ~ /^cp/ {print $5,$9}'
811 cpan
8190 cpan5.30
8395 cpan5.34
176640 cpio
167136 cpp
1402 cpu_profiler.d
134288 cpuctl
1540 cpuwalk.d
  • awkコマンドは一度作ったawkスクリプト(.awk)を再利用できる
yoshinoyoshino

Chapter15 シェルスクリプトを書こう

  • シェルのコマンドラインをあらかじめ記述したファイルをシェルスクリプトと呼ぶ。
  • シェルスクリプトはbash向けに書くのが一般的。
    • シェルスクリプトはさまざまな環境で動作できたほうがよい。
      • bashはほぼデフォルトでインストールされている。
      • shの実装はLinuxのディストリビューションごとに異なる。
# workspaceのファイル使用量を表示する
du -h ~/Desktop/workspace/ | tail -n 1
 18G	/Users/yoshinominako/Desktop/workspace/
./wssize.sh
#!/bin/bash

du -h ~/Desktop/workspace | tail -n 1
# すべてのユーザーに実行権限を付与
chmod +x wssize.sh
# ファイル名を指定して実行
# ファイル名の前に./をつけることに注意=シェルはサーチパス(PATH)からコマンドを探すため
./wssize.sh
 18G	/Users/yoshinominako/Desktop/workspace/
  • シェルスクリプトの拡張子を.shにするのは慣例

  • #!/bin/bashはシバン(シェバン)

    • シェルから実行命令を受けたLinuxカーネルはまず対象ファイルの先頭を確認する
      • #!があった場合にはその後ろに書かれたコマンド(この例の場合/bin/bash)を実行する
    • シバンの書かれたシェルスクリプトは、シェルに自分自身のファイル名を引数として与えて実行される
      • $./wssize.sh=$ /bin/bash ./wssize.sh
  • 現在のシェルとは別のサブシェル(bash)で実行される

  • sourceコマンドは指定したファイルの内容をそのままコマンドラインに入力したときと同じように実行する

    • 現在のシェルでシェルスクリプトに書かれた内容が実行される
    • ~/.bashrcの内容を現在のシェルに反映させたいときはsoruceコマンドを使う
./wssize-noshebang.sh
du -h ~/Desktop/workspace | tail -n 1
source ./wssize-noshebang.sh
 18G	/Users/yoshinominako/Desktop/workspace/
  • 独自のコマンドは~/binというディレクトリがよく使われる
    • PATHに~/binを追加することで、普通のコマンドのようにシェルスクリプトが実行できる
~/.bash_profile
PATH="$PATH:~/bin"
source ~/.bash_profile
wssize.sh
 18G	/Users/yoshinominako/Desktop/workspace/
yoshinoyoshino

Chapter16 シェルスクリプトの基礎知識

  • 複数のコマンドを実行する
    • 改行は無視される
    • 複数のコマンドを;で区切ることで1行で書ける
rootls.sh
#!/bin/bash

echo "root directory"
cd /
ls -l
rootls-noline.sh
#!/bin/bash

echo "root directory";cd /;ls -l
  • 長い行は\で改行できる
  • パイプ|でコマンドを繋ぐ際も、改行を入れてもよい
rootdir.sh
#!/bin/bash

echo \
"root directory"
  • コメントは#
  • 変数
    • $で参照できる
      • テキストと連結したい場合は{}で囲む
      • 'ではなく"を使う
    • 代入時、=の前後にスペースをあけない
    • 変数名に利用できるのはアルファベットと数値と_だけ
      • 一般的に環境変数は大文字、それ以外の通常のシェル変数は小文字を使う
var.sh
#!/bin/bash

appdir=/home/osumi/myapp
echo $appdir
sep_var.sh
#!/bin/bash

filename=residue.dat
echo ${filename}_backup
quote.sh
#!/bin/bash

country=Japan
echo 'I came from $country'
echo "I came from $country"
echo 'I came from ${country}'
echo "I came from ${country}"
./quote.sh
I came from $country
I came from Japan
I came from ${country}
I came from Japan
  • $()という形式で、コマンドの出力結果を文字列として取得できる=コマンド置換
datefile.sh
#!/bin/bash

filename=$(date '+%y-%m-%d')
touch "$filename"
  • コマンドライン引数は$1, $2, ...という位置パラメータで取得できる
    • $ ./parameters.sh aaa bbbというコマンドを実行した場合、$0./parameters/sh$1aaa$2bbbが格納されている
    • 引数の個数は$#で取得できる
    • 引数を分割せずまとめて取得するには$@を利用する
      • シェルスクリプトに指定された引数を別のコマンドに渡す時に便利

制御構造

  • if文
    • ifの後ろにはコマンドを置く
      • [は組み込みコマンド
      • コマンドはすべて終了時に終了ステータスを返す
        • 終了ステータスは$?というシェル変数で取得できる
        • 正常終了で0、エラー時には0以外の値を返す
      • シェルスクリプトのif文は、コマンドの終了ステータスが0だったときは真、そうでない場合は偽と判定する
#!/bin/bash
if [ "$1" = "bin" ]; then
    echo "OK"
else
    echo "NG"
fi

# -qオプションはコマンドの終了ステータスだけを利用したい場合に使う
if grep -q 'bash' /etc/passwd; then
    echo 'bash found'
fi
#!/bin/bash
num1=$1
num2=$2
# int1 -lt int2でint1がint2より小さい 
# -ltなどの比較演算子を使用する場合、シェルは自動的に文字列を整数に変換する
if [ "$num1" -lt "$num2" ]; then
    echo "num1 is less than num2"
fi
  • &&:コマンド1が正常終了したときだけコマンド2を実行する
  • ||:コマンド1が正常終了しなかったときだけコマンド2を実行する
    • いずれもif文でAND条件、OR条件として使える
# ファイルが存在すればcatコマンドを実行する
$ [ -f file.txt ] && cat file.txt
  • シェルスクリプトの終了ステータスは最後に実行したコマンドの終了ステータスとなる

    • 明示的に終了ステータスを指定したい場合はexitコマンドを使用する
      • exitコマンドを実行するとそこでシェルスクリプトは終了する
  • for文

    • リストの部分にはコマンド置換を記述することもできる
      • seq <開始値> <終了値>
    • リストとして$@を記述して、すべてのコマンドライン引数に対して処理を行うケースがよくある
for.sh
#!/bin/bash

for name in aaa bbb ccc
do
    echo $name
done
for-touch.sh
#!/bin/bash

for i in $(seq 1 5)
do
    touch "000${i}.txt"
done
  • case文
    • *は任意の文字列、?は任意の一文字を表す
case-test.sh
#!/bin/bash

case "$1" in
    *.txt)
        less "$1"
        ;;
    *.sh)
        vim "$1"
        ;;
    *)
        echo "not supported file : $1"
        ;;
esac
  • while文
while.sh
#!/bin/bash

i=1
while [ "$i" -le 10 ]
do
    echo "$i"
    i=$((i + 2)) # bashの算術式展開と呼ばれる機能
done
  • シェル関数
    • 終了ステータスを明示するときはreturnコマンドを使う
func-test.sh
#!/bin/bash

homesize ()
{
    date
    du -h ~ | tail -n 1
}

homesize
yoshinoyoshino

Chapter17 シェルスクリプトを活用しよう

  • シェルスクリプトが役立つケース
    • 既存のコマンドを組み合わせて新しいコマンドを作成する
  • シェルスクリプトの欠点
    • 大規模開発には向かない
    • IDEの恩恵を受けられない
    • 1行ずつコマンドを実行していくので子プロセスを生成する処理が大量に発生する=動作が遅くなりがち
diary.sh
#!/bin/bash

# 日記データの保存ディレクトリ
directory="${HOME}/diary"

# データ保存ディレクトリがなければ作成する
if [ ! -d "$directory" ]; then
	mkdir "$directory"
fi

# 日記ファイルパスの組み立て
diaryfile="${directory}/$(date '+%Y-%m-%d').txt"

# 日記ファイルがなければ、先頭に日付を記入
if [ ! -e "$diaryfile" ]; then
	date '+%Y/%m/%d' > "$diaryfile" # >は標準出力のリダイレクト
fi

vim "$diaryfile"
  • localでローカル変数を宣言できる
  • bashのIFS(内部フィールド区切り文字)という環境変数のデフォルト値はスペース、タブ、改行の3つ
    • ファイル名のスペースも区切りとして解釈されるので注意
tree.sh
#!/bin/bash

list_recursive ()
{
	# ローカル変数としてfilepath, indentを宣言
	local filepath=$1
	local indent=$2

	# インデント付きで、パス部分を取り除いてファイル名を表示する
        # ${filepath##*/}はパラメータ展開。最長マッチで、前方一致した部分を取り除く
	echo "${indent}${filepath##*/}"

	if [ -d "$filepath" ]; then
		# ディレクトリの場合の処理
		local fname
		for fname in $(ls "$filepath")
		do
			# インデントにスペースを追加して再帰呼び出し
			list_recursive "${filepath}/${fname}" "	$indent"
		done
	fi
}

# 区切り文字を改行だけにする
_IFS=$IFS
IFS=$'\n'
list_recursive "$1" ""
IFS=$_IFS
  • xargsコマンド
    • xargs <実行したいコマンド>の形式で使い、標準入力から受け取った引数のリストを実行したいコマンドに渡す
    • findコマンドとセットでよく使われる
# lsコマンドは標準入力を受け取らないため、findコマンドの結果は無視されている
find ./dir1/ -type f -name '*.txt' | ls -l
total 24
-rw-r--r--  1 yoshinominako  staff   443  4 14 20:47 diary.sh
drwxr-xr-x  7 yoshinominako  staff   224  4 14 22:42 dir1
-rw-r--r--  1 yoshinominako  staff  4096  4 14 22:45 dir1.tar
-rw-r--r--  1 yoshinominako  staff   531  4 14 22:36 tree.sh

# findコマンドの結果が標準入力としてxargsに渡されている
find ./dir1/ -type f -name '*.txt' | xargs ls -l
-rw-r--r--  1 yoshinominako  staff  0  4 14 22:42 ./dir1//file-1.txt
-rw-r--r--  1 yoshinominako  staff  0  4 14 22:42 ./dir1//file-2.txt
-rw-r--r--  1 yoshinominako  staff  0  4 14 22:42 ./dir1//file-3.txt
-rw-r--r--  1 yoshinominako  staff  0  4 14 22:42 ./dir1//file-4.txt
-rw-r--r--  1 yoshinominako  staff  0  4 14 22:42 ./dir1//file-5.txt
findgrep.sh
#!/bin/bash

usage()
{
	local script_name=$(basename "$0")
	# <<はヒアドキュメントという記法
    # 複数行のテキストを記述するときに使う
	cat << END
	Usage: $script_name PATTERN [PATH] [NAME_PATTERN]
	...
	END
}

pattern=$1
directory=$2
name=$3

# コマンドライン引数がないときはヘルプを表示して終了
if [ "#0" -eq 0 ]; then
	usage()
	exit 1
fi

# directoryが空文字列ならばカレントディレクトリを設定
if [ -z "$directory" ]; then
	directory='.'
fi

# nameが空文字列ならば*を設定
if [ -z "$name" ]; then
	name='*'
fi

# 検索ディレクトリが存在しない場合はエラーメッセージを表示して終了
# 1>&2でechoコマンドの標準出力を標準エラー出力にリダイレクトしている
if [ ! -d "$directory" ]; then
	echo "$0: ${directory}: No such directory" 1>&2
	exit 2
fi

find "$directory" -type f -name "$name" | xargs grep -nH "$pattern"
yoshinoyoshino

Chapter18 アーカイブと圧縮

  • 複数のファイルやディレクトリをまとめたファイルのことをアーカイブ(書庫)と呼ぶ
    • このとき、アーカイブファイルのサイズを小さく=圧縮すればファイルの管理がしやすくなる
  • WindowsやMacOSではアーカイブと圧縮を同時に行うが、Linuxではアーカイブしてから圧縮する、というように別個に処理するのが普通

  • tarコマンド:アーカイブファイルを扱うためのコマンド
    • tarコマンドのオプションは歴史的な理由からハイフンをつけなくてもよい
mkdir dir1
touch dir1/file-{1..5}.txt # プレース展開 {<開始数値>...<終了数値>}で連番のリストを生成
ls dir1
file-1.txt	file-2.txt	file-3.txt	file-4.txt	file-5.txt
# ファイルをアーカイブする
# tar cf <アーカイブファイル> <アーカイブ元ファイルパス>
# cはcreate、fはfileを意味しており、
# ファイル名を指定して新しくアーカイブファイルを作成するオプション
tar cf dir1.tar dir1
# アーカイブファイルの内容確認
# tオプションをつけるとアーカイブファイルの中に含まれるファイル一覧が出力される
tar tf dir1.tar
# アーカイブファイルの復元
# xはextractのxを表す
# tarで展開されるファイル名と同じ名前のファイルがある場合、アーカイブ展開時に元のファイルは上書きされてしまう
tar xf dir1.tar
  • tarコマンドはファイルのパーミッションやオーナーなどのファイル属性もそのままアーカイブする

    • 一般ユーザーでtarコマンドを実行する場合には、一部のファイル属性が維持できない場合がある
      • 読み込みパーミッションがないファイルなど
    • 完全なバックアップを取得するならばroot権限でtarコマンドを実行することが必要になる
  • gzipコマンド:ファイルの圧縮・展開を行う

ps aux > ps.txt
ls -l ps.txt
-rw-r--r--  1 yoshinominako  staff  133739  4 15 10:07 ps.txt
# gzipでファイル圧縮
# .gzファイルだけが残り、元のファイルは削除される
gzip ps.txt
ls -l ps.txt.gz
-rw-r--r--  1 yoshinominako  staff  24684  4 15 10:07 ps.txt.gz
# gzip -d でファイル展開
# .gzファイルは削除される
gzip -d ps.txt.gz
ls -l ps.txt
-rw-r--r--  1 yoshinominako  staff  133739  4 15 10:07 ps.txt
# tarコマンドでgzip圧縮するにはzオプションを指定する
tar czf dir1.tar.gz dir1
# .tar.gzファイルを展開するときもzオプションを指定する
tar xzf dir1.tar.gz
  • bzip2コマンド
    • gzip形式よりも圧縮率が高く、データ量をより小さくできる
    • 使い方はgzipコマンドと同じ
    • tarでbz2形式を利用するにはjオプションを利用する
      • tar cjf dir1.tar.bz2 dir1
  • xzコマンド
    • bz2よりもさらに高圧縮率だが、圧縮に時間がかかる
    • tarでxz形式を利用するにはJオプションを利用する
  • zipコマンド
    • アーカイブと圧縮を同時に行う
    • zipファイルはLinuxではあまり使われないが、WindowsやMaxOSではよく使われる
    • Linuxでzip形式を扱うためには、圧縮するためのzipコマンドと展開するためのunzipコマンドの両方を追加でインストールする必要がある
      • yum install zip unzip(CentOS)
      • sudo apt-get install zip unzip(Ubuntu)
# zip形式で圧縮
zip -r dir1.zip dir1
# zipファイルの内容を確認
zipinfo dir1.zip
# zipファイルの展開
unzip dir1.zip
# パスワード付きzipファイルの作成
zip -er dir1.zip dir1
Enter password:
Verify password:
# パスワード付きzipファイルの展開
unzip dir1.zip # パスワード入力のプロンプトが表示される
yoshinoyoshino

Chapter19 バージョン管理システム

  • Gitの設定は~/.gitconfigに保存される
  • git initを実行すると.gitというディレクトリが作成される
    • この.gitディレクトリがGitのリポジトリ(=Gitがファイルの履歴を保存している場所)の実態
  • git diff 49c65bb...などでそのコミットとワークツリーの差分を見ることができる
    • git diff HEADで現在のリポジトリとワークツリーの差分を見ることができる
  • git fetchコマンドで取得した履歴はリモート追跡ブランチに保存される
    • 「リモート名/ブランチ」という名前
    • git branch -rでリモート追跡ブランチを表示
    • git merge origin/masterなどでリモート追跡ブランチをローカルブランチにマージ
    • git fetchとgit mergeを合わせたのがgit pull
yoshinoyoshino

Chapter20 ソフトウェアパッケージ

  • パッケージファイル形式
    • rpm形式:Red Hat Enterprise Linux, CentOS, Fedora
    • deb形式:Debian GNU/Linux, Ubuntu
  • Red Hat系Linuxディストリビューションのパッケージ管理
    • rpmコマンドをラップして機能が追加されているyumコマンドがよく使われる
      • パッケージの依存性を自動的に解決してくれる
    • インストール
      • yum install [パッケージ名]
      • root権限が必要
      • yオプションで、インストール中の質問すべてにyesと入力してインストールできる
    • 削除
      • yum erase [パッケージ名]またはyum remove [パッケージ名]
    • パッケージを探す
      • yum search [検索ワード]
    • パッケージの情報表示
      • yum info [パッケージ名]
  • Ubuntu系Linuxディストリビューションのパッケージ管理
    • APT(Advanced Packaging Tools)系コマンドがよく利用される
      • yumコマンドと同様に依存性の解決を行ってくれる
    • インストール
      • sudo apt-get install [パッケージ名]
        • root権限が必要なのでsudoコマンドを利用して実行する必要がある
    • 削除
      • sudo apt-get remove [パッケージ名]
      • sudo apt-get purge [パッケージ名]:設定ファイルも含めてすべてのファイルを完全に削除
    • パッケージを探す
      • apt-cache search [検索ワード]
        • --names-onlyオプションでパッケージ名だけを検索対象にする
    • パッケージの情報表示
      • apt-cache show [パッケージ名]
このスクラップは2024/04/15にクローズされました