質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

221閲覧

Rubyのパスが異なる環境でも動作できるようにするには

taro373

総合スコア189

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2017/12/25 09:58

rubyのパスが異なる環境でも動作するように、下記のように記述しました。

#! /bin/sh exec ruby -S -x "$0" "$@" #! ruby

「起動されたshは2行目のexecでRubyに飛び、Rubyは3行目までを読み飛ばす」
と解説がありましたが、
スッキリと理解できません。

$0 - 実行しているシェルスクリプトのパス
$@ - シェルスクリプトに渡されたすべての引数

『Rubyは3行目までを読み飛ばす』と、なぜrubyのパスに
関係せず4行目以降のスクリプト実行できるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

そもそも、「Rubyのパスが異なるとスクリプトを書き換えないと動かないRubyスクリプト」についての理解はありますでしょうか?

Ruby

1#!/usr/bin/ruby 2スクリプト本体

は、Rubyが/usr/bin/rubyにある環境では動きますが、/usr/local/bin/rubyにしかない環境では動きません。
1行目は、スクリプトを処理するプログラムの絶対パスを書かないといけません。
そのため、Rubyの場所が分からない場合は、1行目を#!/bin/shと書いて、その後をシェルスクリプトとして実行します。

2行目のrubyは、環境変数PATHからrubyというファイルを探してそれを実行します。Rubyの絶対パスを書く必要はありません。

あとは、Rubyのオプションと-S-xがそのためにあるオプションなので、
-S・・・・・スクリプト名だけで起動した場合は、その名前のスクリプトファイルをPATHから探す
-x ・・・・#! rubyの行まで読み飛ばす
というコンビネーションで、期待通りの動作をします。

別のやり方としては、

Ruby

1#!/usr/bin/env ruby 2スクリプト本体

と書くのを好む人もいますね。使える場面が限定されますが。

投稿2017/12/25 13:19

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2018/01/04 06:36

maisumakunさんの回答まで読んで、やっと理解できました ありがとうございました
guest

0

この方法によるRubyの実行は、「シェルスクリプトとしての実行」と「Rubyの実行」の2パートに分かれています。

まず、最初に#!/bin/shがあるので、このファイルはシェルスクリプトとして実行が始まります。そして、2行目のexec rubyでRubyを呼び出して、プロセスをRubyのものに上書きしてしまいます。

Rubyでは、#!rubyまで読み飛ばして、残りをRubyとして実行します。

投稿2017/12/25 10:09

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問