【シェルスクリプト基礎】スクリプトを実行する様々な方法をご紹介!

スクリプト

シェルスクリプトを実行する時に困った事はありませんか?

シェルスクリプトのコマンド実行での失敗メッセージ一覧
  • 「実行権限がありません」
  • 「コマンドが見つかりません」

上記のようなメッセージが出て、シェルスクリプトを実行するときに戸惑った人も多いと思います。

そこで今回はシェルスクリプトを実行する色々な方法を記事にしました。

それぞれの特徴と掴んで最適なシェルスクリプト実行方法を選べば、効率よく作業する事が可能になります。

pythonやphpを使用して業務効率化やアプリやWebサイトを作成しております。batやjavaやシェルスクリプトなど様々なプログラミングを行った実績ありの筆者です。

目次

シェルスクリプトを実行する方法

シェルスクリプトでコマンド実行する方法は以下です。

シェルスクリプトを実行する方法
  • 実行権を与えて相対パスでシェルスクリプトを実行する
  • bashコマンドでシェルスクリプトを実行する
  • sourceコマンドでシェルスクリプトを実行する

一つ一つ見ていきます。

実行権を与えて相対パスでシェルスクリプトを実行する

実行権を与えて相対パスでシェルスクリプトを実行

実行権を与えて相対パスでシェルスクリプトを実行する

一番は本来のシェルスクリプトに実行権限を与えて相対パスで指定する事です。

相対パスでシェルスクリプトを実行する手順

手順は以下の通りです

STEP
シェルスクリプトを作成します。

以下のシェルスクリプトを作成してください。

vi シェルスクリプト
STEP
シェルスクリプトに実行権限を与えます

以下のコマンドでシェルスクリプトに実行権限を与えます。

chmod +x シェルスクリプト
STEP
相対パスでシェルスクリプトを実行します

以下のコマンドでシェルスクリプトを実行します

./シェルスクリプト

相対パスでシェルスクリプトを実行してみる

実際にシェルスクリプトを作成して実行してみます。

以下のシェルスクリプトを作成しました。

#!/bin/bash

message='シェルスクリプト実行しました!'

echo $message

「ls -l」コマンドで現ディレクトリをみてみます。

ここで一度相対パスで実行してみます。

[root@localhost workspace]# ./shell_script_execution.sh
-bash: ./shell_script_execution.sh: 許可がありません

「許可がありません」と出て実行できません。

「ls -l」コマンドで確認してみましょう。

シェルスクリプト作成

「x」がないので実行権限がありません。

実行権限を付けてみましょう。

[root@localhost workspace]# chmod +x shell_script_execution.sh

もう一度見てみましょう。

シェルスクリプトの実行権限付与

すべてに「x」(実行権限)が付与されて、ファイルが緑色になりました。

シェルスクリプトを実行します。

[root@localhost workspace]# ./shell_script_execution.sh
シェルスクリプト実行しました!

シェルスクリプトを相対パスで実行する事が出来ました。

これが一般的なやり方になります。

しかしシェルスクリプトを試したりするのに、実行権限などをいちいちつけるのは面倒です。

bashコマンドでシェルスクリプトを実行する

シェルスクリプトを実行

次は「bash」コマンドの後にシェルスクリプトを書く方法です。

bashコマンドで実際にシェルスクリプトを実行してみる

もう一度同じ内容のシェルスクリプトを作成します。

シェルスクリプト名を「shell_script_execution2.sh」としました。実行権限はありません。

[root@localhost workspace]# ls -l
合計 8
-rwxr-xr-x. 1 root root 84  4月  6 21:57 shell_script_execution.sh
-rw-r--r--. 1 root root 84  4月  6 22:28 shell_script_execution2.sh

bashコマンドでシェルスクリプトを実行します

[root@localhost workspace]# bash shell_script_execution2.sh
シェルスクリプト実行しました!

実行できました。

権限が不要で実行できるので、テストや開発ではこちらがオススメです。

sourceコマンドでシェルスクリプトを実行する

シェルスクリプトを実行

今度は「source」コマンドでシェルスクリプトを実行してみます。

前と同じく実行権のないシェルスクリプトを実行してみます。

[root@localhost workspace]# source shell_script_execution2.sh
シェルスクリプト実行しました!

こちらでも実行できました。

また「source」コマンドは「.」に省略できます。実行してみます。

[root@localhost workspace]# . shell_script_execution2.sh
シェルスクリプト実行しました!

こちらでも実行できています。

sourceコマンドで実行する時の注意点

「bash」コマンドとの違いは現bashシェルで動くので、変数や関数などが保存されます。

先程のファイルで変数「message」を使用していました。

こちらの変数の値が残っているか「echo $message」で試してみます。

[root@localhost workspace]# echo $message
シェルスクリプト実行しました!

$message変数に入っていた「シェルスクリプトを実行しました!」という文字が残っています。

setコマンドで何が残っているか確認出来ます。

[root@localhost workspace]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=80
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=ja_JP.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=2328
PROMPT_COMMAND='printf "3]0;%s@%s:%s
[root@localhost workspace]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=80
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=ja_JP.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=24
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=2328
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root/workspace
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.56.1 64018 22'
SSH_CONNECTION='192.168.56.1 64018 192.168.56.10 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=122
_=シェルスクリプト実行しました!
colors=/root/.dircolors
message=シェルスクリプト実行しました!
7" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' PS1='[\u@\h \W]$ ' PS2='> ' PS4='+ ' PWD=/root/workspace SELINUX_LEVEL_REQUESTED= SELINUX_ROLE_REQUESTED= SELINUX_USE_CURRENT_RANGE= SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_CLIENT='192.168.56.1 64018 22' SSH_CONNECTION='192.168.56.1 64018 192.168.56.10 22' SSH_TTY=/dev/pts/0 TERM=xterm UID=0 USER=root XDG_RUNTIME_DIR=/run/user/0 XDG_SESSION_ID=122 _=シェルスクリプト実行しました! colors=/root/.dircolors message=シェルスクリプト実行しました!

元々設定されている値がほとんどですが、最後に「message」変数がはいっていました。

削除したい場合は「unset」コマンドで可能です。

[root@localhost workspace]# unset message

setコマンドで確認

~省略~
XDG_SESSION_ID=122
_=message
colors=/root/.dircolors
[root@localhost workspace]#

「message」変数が消えていました。

シェルスクリプトを実行する方法のまとめ

スクリプト

シェルスクリプトでコマンド実行する方法は以下です。

シェルスクリプトを実行する方法
  • 実行権を与えて相対パスでシェルスクリプトを実行する
  • bashコマンドでシェルスクリプトを実行する
  • sourceコマンドか.(省略形)でシェルスクリプトを実行する

それぞれの特徴を以下にまとめます。

実行方法実行環境使うべき環境メリットデメリット
相対パスで実行カレントシェルの
子プロセス
運用環境権限付与が面倒
bashコマンドで実行カレントシェルの
子プロセス
テストや開発気軽に試せる
sourceコマンドか
.(省略形) で実行
カレントシェルテストや開発で
変数なども残したい
変数などが残り、運用と違う動きをする可能性あり
シェルスクリプト実行のやり方の特徴一覧
スクリプト

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次