🐚

【完全版】fish シェルスクリプト

2021/06/03に公開

はじめに

この記事では、fish shellでシェルスクリプトを実行する方法について紹介します!

前提

  1. fish shellを使っていること (設定はこの記事でわかりやすく説明しています)

https://zenn.dev/sawao/articles/0b40e80d151d6a
2. やる気

まず、シェルスクリプトとは

まず、シェルスクリプトとは何なのか。fishを使っている皆さんなら、シェルが何なのかは大体イメージできると思います。ですが、シェルスクリプトと聞くと、「うっ」となる人が多いのではないでしょうか?

シェルスクリプトとは、シェルによって解釈・実行される一連の処理を記述したスクリプトです。

ん?何言ってんだこいつ

そう思ったあなた、しっかり説明するのでご安心ください。
まずシェルは、osの核の部分とユーザーの架け橋となる存在です。osの核には下手に触るとシステム自体が壊れてしまうような取り扱い注意のファイルが多くあり、ユーザーにとっても危険です。

そこで、ユーザーはシェルを通してosの核に命令をすることで、安全にユーザーは操作することができます(ユーザーがシェルに送る命令をコマンドと言います)。そのため、シェルはユーザーにとって不可欠なものなのです。


そして、シェルスクリプトはそのコマンドをまとめたプログラムのことです。様々なコマンドをシェルスクリプトにまとめることで、そのシェルスクリプトを実行するだけで一度にいろいろな操作ができるようになります。

例えば、gitの操作のながれをいちいちコマンドで打つだけではなく、シェルスクリプトにまとめて記述し、実行することで、手間を省く事ができます。また、シェルスクリプトは使いまわしができるため、コマンドの詳細を覚えていなくても、どのシェルスクリプトを実行すればいいかだけを覚えるだけで、したい操作を行うことができます。

以上がシェルスクリプトの説明です。多分まだもやもやしていると思いますが、これから実際にシェルスクリプトを記述、実行するところを解説するので、そこで理解を深めていただければな、と思います。

シェルスクリプトの記述・実行方法

注意⚠️

ここから先は、すべてfish shellでのやり方になります。
zshやbashだと、ファイル名やコマンドに差異がある場合がございますので、ご了承ください。

二種類ある?

シェルスクリプトの記述・実行方法には大きく二種類あります。

  1. <任意の名前>.sh ファイルに記述し、実行する方法
  2. ~/.config/fish/functions/の中に、<任意の名前>.fishファイルを作成し、ファイル内にfunctionを定義する方法

1のやり方

1は、fishに限らず、zshやbashでも同じような手順で実行する事ができます。
任意のディレクトリに、<任意の名前>.sh ファイルを作り、その中にコマンドを書き連ねます。
そして、sh <shファイルのパス> そのファイル内に書かれたコマンドを実行します。

文字だけだとわかりずらいので、実際にやってみます。

また、今回は複雑なシェルスクリプトは記述しません。あくまで、通常打つコマンドをまとめて実行する、という目的で書いていきます。ちなみに、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすことシェル芸と言います


<実際にやってみる>
ターミナルやiTermなどのアプリケーションを立ち上げます

$ cd ~/Desktop            
# 任意のディレクトリに移動
$ touch test.sh           
# 任意のshファイルを作成

これで、Desktopディレクトリ内にtest.shというファイルを作成できました。
次に、test.shファイルを編集します。任意のエディタを立ち上げて、

# test.shファイル
echo "Hello World!!"   # echoは ""内の文字を出力するコマンド
echo "Hello shell!!"  
echo "your name :" && read name    # &&は連続して実行するコマンド。
                                   # この場合は、echoで出力してからreadで入力を受付、nameという変数に格納している
echo "Hello ${name}"               # ${変数名}で変数を使うことが可能

これで、test.shファイルの記述が終わりました。では、実行してみましょう!
先程作った任意のディレクトリ上で、以下のコマンドを実行します

$ sh test.sh

そうすると、Hello World!!の下に Hello shell!! , your name :が実行された後、
入力待ちの状態になるかと思います
そこで、任意の文字を入力し、Entarキーを押して、
Hello <入力した文字列> と表示されると成功です!!


2のやり方

1のやり方だけでもいいのですが、多少の欠点があります。

まず、sh ~~.shと記述するのがはっきり言ってめんどくさい。ズバリ、ちょっと長くないですか?
また、どこのディレクトリに何のshファイルがあるのかを忘れることもあると思います。

そこで、fishではある決まった場所にシェルスクリプトをまとめた関数を定義することで、いつどこにいても関数名を入力するだけで、シェルスクリプトを実行することができる仕組みがあります

ある決まった場所とは、~/.config/fish/functions/の階層下か、~/.config/fish/config.fishのどちらかです。この特殊な場所にシェルスクリプトの関数を記述します。

また、~/.config/fish/config.fishに関数を定義してもいいのですが、そうすると~/.config/fish/config.fishが膨大な量になってしまうので、可読性が悪くなります。ですので、自分は~/.config/fish/functions/ 内に記述することを推奨します。

~/.config/fish/functions/ 内に記述するときはファイルの名前と関数の名前を揃える必要があります。
詳しくは、fish公式ドキュメントに載っています。該当箇所を抜粋します。


それでは、実際にやってみましょう!

# まずは~/.config/fish/functionsに移動します
$ cd ~/.config/fish/functions
そして、今回はtest関数を定義するので、test.fishファイルを作成します
$ touch test.fish

次に、test.fishファイルの中身を設定していきます。

funciton test
  echo "Test World!!"
end

functionやendはシェルスクリプトの関数の定義の仕方です。関数の中身は自由に記述できますが、今回はechoのみの単純なコマンドにしました。

今回はtest.fishファイルを作成したため、functionの名前をtestとしなければいけません。他の名前だとエラーがでますのでご注意ください

これで、設定は終わりました!!後は実行するだけです。関数を反映させるために、一度ターミナルを再起動します。
そして、再度ターミナルを立ち上げて、

$ test

と実行します

Test World!!

と表示されていれば完成です!!これで、どんなところにいてもtest関数を実行することができます。

終わりに


この記事では、fish シェルでシェルスクリプトを記述・実行する方法について解説していきました。これを読んで、少しでもシェルスクリプトって便利だな、と感じていただければ幸いです。

シェルスクリプトをマスターすれば、あらゆる動作をたった一つのコマンドで実行することができるので、是非チャレンジしてみてください!!

Discussion