動かないスクリプトを直せ
中段 / 目安 30分
商店街の各店から届く日報を1つのファイルにまとめる作業を、鴫原さんは去年まで手で cat していました。今年になって、事務局にアルバイトで来ていた学生さんが「スクリプトにしておきましたよ」と置いていったそうです。
「その子がな、自分のパソコンで書いたやつを USB で持ってきてくれたんだ。動くって言っとった。だが、うちでは動かん」
打ってみると、こうなります。
プレーンテキスト
-bash: /opt/yumesaku/bin/nippou-matome.sh: Permission denied「権限か? と思って中を見たんだが、書いてあることは間違っとらんように見える。わしにはこれ以上分からん」
スクリプトが動かないときの理由は、たいてい中身ではなく外側にあります。今日はその外側を見ます。
ファイルは「実行してよい」と印がついていないと動かない
Linux では、ファイルが実行できるかどうかは中身では決まりません。ファイルに付いている実行の許可で決まります。見るには ls -l です。
ターミナル
ls -l /opt/yumesaku/bin/nippou-matome.sh先頭に -rw-r--r-- のような10文字が出ます。2文字目から3文字ずつで、所有者・グループ・その他の許可を表します。r が読み、w が書き、x が実行です。x が1つも無ければ、そのファイルは誰にも実行できません。Permission denied はこれを言っています。
実行の許可を足すのが chmod です。
ターミナル
chmod +x /opt/yumesaku/bin/nippou-matome.sh+x は「実行の許可を足す」という意味です。数字で chmod 755 と書く流儀もあります。どちらでも結果は同じところに着きます。
1行目がスクリプトの行き先を決めている
実行の許可を足しても、まだ動かないことがあります。今度は別のことを言われます。
プレーンテキスト
-bash: /opt/yumesaku/bin/nippou-matome.sh: /usr/bin/env: bad interpreter: No such file or directoryスクリプトの1行目には、そのファイルを誰に読ませるかが書いてあります。#! で始まるこの行をシェバンと呼びます。
ターミナル
#!/bin/bashカーネルはこの行を読み、書かれているプログラムを起動して、そこにスクリプトの中身を渡します。だから #! の後ろに書いてあるパスが実在しなければ、当然そこで止まります。bad interpreter はそういう意味です。
人によって環境が違うので、書き方も分かれます。#!/bin/bash はパスを直接指すやり方、#!/usr/bin/env bash は env に探させるやり方です。どちらを書くにしても、その機械に実在するパスでなければ動きません。実在するかは次で確かめられます。
ターミナル
ls -l /bin/bash
which bash1行目だけを見るなら head -1 が早いです。
ターミナル
head -1 /opt/yumesaku/bin/nippou-matome.sh完成条件
/opt/yumesaku/bin/nippou-matome.shが、フルパスで打つだけで動くこと- 実行すると、
/var/yumesaku/nippouの中にある日報を1つにまとめ、/root/nippou-matome.txtに書き出すこと。この処理そのものはスクリプトの中に既に書かれています - スクリプトの中身の処理は書き換えないこと。直すのは動かない原因だけです
進め方
まず ls -l で外側を見て、次に head -1 で1行目を見てください。エラーメッセージは正確に読むと、それだけで原因の半分を教えてくれます。
ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
課題
- /opt/yumesaku/bin/nippou-matome.sh がフルパスで打つだけで動くこと
- 実行の許可が付いていること
- 1行目のシェバンが、この機械に実在するパスを指していること
- 実行した結果として /root/nippou-matome.txt に3店ぶんの日報がまとまっていること
- スクリプトの中身の処理は書き換えないこと
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです