Nobody dies a virgin

映画/音楽/時々プログラミング

シェルとシェルスクリプトの違いについて

今まで"シェル"や"カーネル"など特に気にせずにここまでコーディングやアプリ開発をしてきましたが、いい加減しっかりと学ぶ時が来たようです。なぜなら、現在aws ec2上のmysqlサーバーのデータをバックアップする際に毎日手動でmysqldumpコマンドを打ってバックアップを取るのは面倒であるからだ。できれば自動でバックアップをとり、特定の場所に(特定の時間に)保存しておいて欲しいといった気持ちに駆られてきた。色々調べるとどうやら"シェルスクリプトというものを書くといいよ"という記事をたくさん見かける。『”シェルスクリプト?”........。それって"シェル"と呼ばれるものですか?』なんて混乱していた私がネットで勉強したことを備忘録としてまとめる。

そもそもシェルとは何なのか?

普段私たちの使っているPCにはOSと呼ばれるものが入っていることはどんな人でも知っていると思う。OSは鉄の塊の箱であるPCが計算機をとして機能するための一種の人格のようなものである。私たちはそのOSという人格を持ったPCに命令することによって色々な機能を使うことができる。(ex. PCでwebサイトを見たり、アプリケーションを動かしたりなど)そしてPCを動かしてくれるOSの中にはカーネルという中心人物がいるのである。カーネルだけではOSはPCを動かすことができないが、とても需要な要素である。(サッカーで言う司令塔かな?) では私たち人はどんな方法でOS(カーネル)に命令をしているのだろか?もちろんだがOS(カーネル)に対して日本語などの言語を使って命令しても動くはずがない。日本語が通じないのであれば通訳がいれば良いのではないだろうか。そこで登場するのが"シェル"である。シェルとはカーネルに対して人が命令するための手段を提供してくれる存在であると言える。ここで具体例をあげたいところであるが、私が勉強の際にとてもお世話になったサイトがあるのでそちらを参考してもらいたい。

wa3.i-3-i.info

このサイトによると、

まぁ「シェル」って単語が出てきたら「人間の入力をコンピュータに伝えるプログラムなんだな~」と、お考えください。

引用: シェル (shell)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

なんとも簡単な説明であるが、とてもわかりやすい。私たちはカーネルと直接やりとりができないためシェルという存在が必要でカーネルとのやりとりを取り持ってくれるのである。次章ではシェルの具体的な処理について書いていきたいと思う。

シェルの機能とは

シェルの一番基本的な機能として、コマンドインタプリタの機能があります。これには、次の動作が含まれます。

ユーザにコマンド入力を促すためのプロンプト (prompt) を表示する。 キーボードから入力された文字列(コマンド)の解釈を行う。 コマンドとして入力された名前のプログラムを探し出して起動する。

引用: シェルの概念と機能

まさに先ほど述べた受付のお姉ちゃんのようなことをしていますね。そして、以下の文章も興味深いです。

ls コマンドや cp コマンドなどは、C言語で書かれコンパイルされたプログラムです。プロンプトで ls と打てば、ls というプログラムファイル(実体は /bin/ls )を検索して起動します。中には pwd コマンドや cd コマンドのように、独立したファイルでなくシェル内部に組み込まれたコマンド(シェルコマンド)もあります。それらはインタプリタの解釈の時点で組み込みのコマンドとして認識して対応する処理を行います。

引用: シェルの概念と機能

普段使い慣れていて気にしていなかったlsコマンドは実はC言語のプログラムでシェルが表示してくれたプロンプトにlsと打つとそのプログラムを探して実行してくれているわけです。なるほど、lsコマンドは一つのファイルのなのか!それではコマンドは全てがプログラムファイルなのかというとそれは違い、シェルの中に組み込まれているものも存在するようです。(これについてはもっと詳しくなってから追記したいと思います。)なんとなくわかってきました。次はシェルとシェルスクリプトの違いについて考えてみましょう!

だったらシェルスクリプトはなんなのさ?

シェルスクリプトがあるとなんで嬉しいのかをまずまとめてから考えるとわかりやすいかと思います。

EX. シェルスクリプトを書かない場合

コマンド実行時に,引数で指定した1つのファイルが読み込み可能な場合はその内容を表示し,ファイルが読み込み不可のときは終了させる場合

<%= link_to_if %>は使えるやつ

こんにちはタカヤです。 初めてのブログ投稿ですが、自己紹介は後々に譲るとして今回は便利なメッソドを見つけたので備忘録として残しておきたいと思います。

link_to_ifとは

例えばこんな時に使えます。

例: ログインしてるユーザーにだけ表示したいリンクがあるとき(ex. 記事編集、削除)

つまり、ログインしていないユーザーがアプリを閲覧したときに記事の編集や削除のリンクがあると意味もない見た目もイマイチです。そんなときはlink_to_ifを使って条件に一致したときのみリンクを生成するのがこのメソッドです。

使い方

<%= link_to_if(user_signed_in? && article.user_id == current_user.id, "編集", edit_article_path(article))  {}%>
<%= link_to_if(user_signed_in? && article.user_id == current_user.id, "削除", article, method: :delete, data: { confirm: 'Are you sure?' })  {}%>

第一引数には条件を記述します。

今回の場合は、 user_signed_in? && article.user_id == current_user.id となっています。これはuser_signed_in?でユーザーがログインしていればtrueを返すdeviseというgemのヘルパーメソッドです。

そして、次のarticle.user_id == current_user.idはアソシエーションを用いて記述していますが、現在ログインユーザーと記事を書いたユーザーが一致しているときはtrueを返します。

最後にこの両方を&&で繋げて両方が成り立っているときにtrueを返すようになっています。

このようすればビューファイルに直接条件分岐を書かずに済みます。でも、個人的に思ったのはこれはよく使うのでヘルパーに切り出した方が綺麗で保守性が上がる感と思いました。

参考ページ

shuzo-kino.hateblo.jp

link_to_if - リファレンス - - Railsドキュメント

link_to_ifで条件がfalseの時、表示を消す方法 - IwazerReport