メインコンテンツまでスキップ

実行権限とPATHを体験する

この章でできるようになること

chmod +x./script.sh、PATHの関係を説明できるようになります。

第1部で先に学んだ実行権限とPATHを、この章で実際に体験します。

まず知っておくこと

ファイルは、存在するだけでは「直接実行できる」とは限りません。

シェルスクリプトを直接実行するには、実行権限が必要です。

また、コマンド名だけで実行するには、シェルがそのコマンドを探せる場所に置く必要があります。 この「探す場所の一覧」がPATHです。

実行権限、ドットスラッシュ、PATHの関係

実行権限を付ける

練習用リポジトリに移動します。

cd ~/vibe-practice/local-automation

実行権限を付けます。

chmod +x scripts/daily-note.sh

直接実行します。

./scripts/daily-note.sh

ログを確認します。

tail -n 5 logs/daily-note.log

./ が必要な理由

次のように実行すると、見つからない場合があります。

daily-note.sh

今いるディレクトリは、通常PATHに入っていません。 そのため、現在のディレクトリにあるファイルを実行するときは ./ を付けます。

./scripts/daily-note.sh
→ 今いる場所から見た scripts/daily-note.sh を実行する

PATHを確認する

PATHを見ます。

echo $PATH

PATHは : で区切られた場所の一覧です。 すべてを暗記する必要はありません。 今は「シェルが左から順にコマンドを探す場所」だと考えてください。

コマンドの場所を確認します。

command -v bash
command -v git

第1部で見た command -v は、ここでも使います。

PATHに通すとは何か

「PATHに通す」とは、シェルがコマンドを探す場所に、そのコマンドの置き場所を追加することです。

たとえば ~/bin をPATHに入れておくと、そこに置いた実行ファイルをコマンド名だけで呼べます。

ただし、PATHの変更はシェル設定ファイルに影響します。 第1部で扱った .zshrc.zprofile への追記と同じく、何を追記するのか確認してから行います。

任意: ~/bin に置いてみる

この手順は任意です。 PATHを変更したくない場合は、読んで理解するだけで構いません。

mkdir -p ~/bin
cp scripts/daily-note.sh ~/bin/daily-note

~/bin がPATHに入っているか確認します。

echo $PATH

入っていない場合は、zshの設定に追記します。 同じ行を何度も追記しないために、まず既存の設定を探します。

grep -n 'HOME/bin' ~/.zshrc

grep は、ファイルの中から文字列を探すコマンドです。 何も表示されなければ、まだ ~/bin の設定はなさそうです。 その場合だけ追記します。

printf '\nexport PATH="$HOME/bin:$PATH"\n' >> ~/.zshrc

新しいターミナルを開くか、次を実行します。

source ~/.zshrc

source ~/.zshrc は、zshの設定ファイルを今開いているターミナルに読み込み直すコマンドです。 設定が不安な場合は、ターミナルを一度閉じて開き直しても構いません。

確認します。

command -v daily-note

見つかれば、次のように実行できます。

daily-note

何が起きたのか

chmod +x は、ファイルを実行できるようにする操作です。

./scripts/daily-note.sh は、現在位置から見たファイルを直接指定して実行しています。

PATHに置き場所を追加すると、ファイル名だけで実行できるようになります。 第0部や第1部でPATH設定を扱ったのは、こうしたコマンド探索のためでした。

運用者の視点

実行権限とPATHは便利ですが、注意も必要です。

  • 何のファイルに実行権限を付けるのか
  • そのファイルの中身を理解しているか
  • PATHの先頭に何を追加するのか
  • 同じ名前のコマンドを上書きしていないか

わからないスクリプトに実行権限を付けてPATHに置くのは危険です。

理解チェック

実行できない原因を、権限、場所、PATHに分けて見られるか確認します。

実行権限、./、PATHの違いを確認する練習問題を出してください。

次の条件でお願いします。

- 問題は5問
- 一問一答形式にする
- 1問ずつ表示し、その直下にA/B/Cの選択肢も毎回表示して、私の回答を待つ
- 選択肢は、A: 実行権限の問題、B: 場所や ./ の問題、C: PATHの問題 にする
- 私は、各問題に対してA/B/Cだけで回答します
- 私が回答するまで、その問題の答え、採点、解説を表示しないでください
- 私が回答したあとで、その問題を採点し、理由も解説してください
- 解説が終わったら、次の問題を1問だけ出してください
- chmod、source、設定ファイル編集は実行しないでください

AIに聞いてみよう

chmod +x、./scripts/daily-note.sh、PATHに通す、command -v の関係を説明してください。

第1部でPATHと実行権限を学んだ前提で、
なぜ見知らぬスクリプトに実行権限を付けてPATHに置くのが危ないのかも説明してください。
まだファイルは変更しないでください。

commitポイント

練習用リポジトリの中で確認します。

git status
git diff

chmod +x はファイルの権限変更としてGitに記録されます。 必要ならcommitします。

git add scripts/daily-note.sh
git status
git diff --staged

権限変更は、差分では 100644 から 100755 のような数字の変化として表示されることがあります。 ファイルの中身ではなく、「実行できるファイルになった」という情報がcommit対象になっています。

問題なければcommitします。

git commit -m "Make daily note script executable"

次へ

次は、Goで小さなCLIを作ります。