バックアップ用のスクリプト backup.sh を書いた./backup.sh したら Permission denied で動かへん
【疑問】スクリプトを作ったのに Permission denied。#! の行、引数の変数、終了ステータス【LPICレベル1】
前提のおさらい。よく使う手順は関数にまとめられる。関数の中では引数を $1 などで受け取る
>>1
実行権限がない。chmod +x backup.sh で付ける。付ける前は Permission denied で終了ステータス126やったbash backup.sh のように bash に渡すなら、実行権限がなくても動く
>>3
1行目の #!/bin/bash は何のため?
>>4
シバン(shebang)。./backup.sh で実行したときに、どのプログラムで中身を読ませるかを決める。#!/bin/sh なら sh、#!/usr/bin/python3 なら Python
>>5#!/bin/nonexist にしたら cannot execute: required file not found で終了ステータス127。書いたプログラムがないと動かへん
>>5
Debian の /bin/sh は bash じゃなくて dash。#!/bin/sh で bash だけの書き方を使うと動かんことがある。ディストリビューションによって /bin/sh が bash のこともあるから、bash の機能を使うなら #!/bin/bash と書く
>>2
スクリプトの引数はどう受け取るん?
>>8$0 スクリプトの名前、$1 $2 … 引数、$# 引数の数、$@ と $* 全部の引数
10番目からは ${10}。$10 は $1 のあとに 0 が付いたものになる
>>9./args.sh "a b" c で試した$# → 2for a in "$@" → [a b] と [c] の2回for a in $* → a と b と c の3回(クォートなしは空白で分かれる)
>>1
終了ステータスって何?
>>11
コマンドが終わったときに返す数。0 が成功、0 以外が失敗。直前のものは $? で見るtrue → 0、false → 1、ls /nonexist → 2
スクリプトでは exit 3 のように返す値を決められる
>>3
どこに置いたら名前だけで動く?
>>13
PATH に入ってるディレクトリ。自分だけなら ~/bin、全員なら /usr/local/bin。所有者と権限も確かめる。他の人が書き換えられる場所に置いたスクリプトを root が動かすと危ない
>>14
スクリプトに SUID を付けたら root で動く?
>>15
Linux では動かない。execve の man に「Linux はスクリプトの set-user-ID と set-group-ID のビットを無視する」とある。特別な権限が要るなら sudo を使う
>>12
chmod +x、1行目は #!/bin/bash、引数は $1 と "$@"、成功は 0。これで動いたわ
管理人のひとこと
./スクリプトで動かすには実行権限(chmod +x)が要る。ないと Permission denied(終了ステータス126)。bash スクリプトなら権限がなくても動く。- 1行目の
#!(シバン)で読ませるプログラムを決める。Debian の /bin/sh は dash なので、bash の機能を使うなら#!/bin/bash。 - 引数:
$0名前、$1〜$9、10番目からは${10}、$#数、"$@"は1つずつ、クォートなしの$*は空白で分かれる。 - 終了ステータスは0が成功。
$?で直前の値を見て、exit nで返す。置き場所は PATH の中(~/bin・/usr/local/bin)。Linux はスクリプトの SUID・SGID を無視する。