
bashのシェルスクリプトを書いています。
当方、Mac Snow Leopard を使っているため、seq コマンドがデフォルトでは使えません。
そこで、.bashrc 内に、seq 関数をあらかじめ自分で定義して、他で使い回したいと思っています。
.bashrc の中に、
function seq() {
i=$1
while [ $i -le $2 ] ; do
echo $i
let i=$i+1
done
}
と、関数を定義しました。
seq 関数をターミナル上で実行すると、
>seq 0 2
0
1
2
と正しく、表示されます。次に、
#!/bin/sh
seq 0 2
と記述したシェルスクリプト(temp.sh)を「source」で実行すると、
>source temp.sh
0
1
2
と正しく、表示されますが、「.」で実行すると、
>./temp.sh
./temp.sh: line 2: seq: command not found
と言われます。
どのような理由によってこの違いが出るのでしょうか??
No.5ベストアンサー
- 回答日時:
追記
source は現在のシェルで実行し、結果がそのまま現在のシェルに適応されます。
今回の temp.sh なら
> source temp.sh
は
> seq 0 2
と入力したのと同等ということになります。
> ./temp.sh
この . はコマンドではなく、 temp.shへのパスを指定するものです。
実行ファイル名だけでコマンドとして実行できるのは、環境変数PATHで指定したディレクトリにあるものだけです。それ以外は、その実行ファイルへの絶対パス、または相対パスが必要となります。
これは、カレントディレクトリにある実行ファイルも例外ではありません。
環境変数PATHに . が無い場合は、 ./ファイル名 と相対パスを指定する必要があります。
(この点は、常に . がPATHにあるように振る舞うMS-DOSやコマンドプロンプトとは違います)
逆に、PATH上にあれば(例えば、 PATH=$HOME/bin:(以下略)となっている時の $HOME/bin )、 temp.sh とファイル名だけで実行できます。
また、こうしたコマンドは新規プロセスで実行されますので、環境変数を除いて、現在の設定は継承されません。
対話的ではないbashや、 shとして起動された bash は .bashrcを読まないので、そこに書いてあることは無効となります。
今まで、
「source temp.sh」と「./temp.sh」は同じものとして使ってきましたが、
こういった違いがあると初めて知りました。
試しに、適当なシェルスクリプト
temp.sh (#!/bin/bash \n sleep 100) 実行時に 「ps u」をしてみると、
「./temp.sh」実行時には、
/bin/bashが新たにプロセスとして立ち上がっていましたが、
「source temp.sh」「. ./temp.sh」実行時には、
それが無く、既存のプロセス内(bash)で動いているようでした。
そして、./temp.sh により、新たに立ち上がったプロセスの方では、
環境変数等以外の設定は継承されず、さらに、~/.bashrcは読み込まれないということですね。
わかりやすい説明をどうもありがとうざいました。
No.4
- 回答日時:
ドット実行ができていないのでは?
正 . ./temp.sh
誤 ./temp.sh
なるほど、確かに、
. ./temp.sh
であれば通りますね。
今まで、シェルスクリプトの実行は、
「source temp.sh」か「./temp.sh」としてやっていましたが、
「source temp.sh」と同等なのは「. ./temp.sh」のようですね。
なぜ、./temp.shで通らないかは、
回答番号:No.5さんの回答で了解しました。
ありがとうございます。
No.2
- 回答日時:
すいません。
勘違い。シェルスクリプト実行として起動されたbashは、~/.bashrc は読みません。
ファイルの先頭に、source ~/.bashrc とでも書くか、seq を関数としてでなく コマンド(シェルスクリプトファイル)として作るか。
>シェルスクリプト実行として起動されたbashは、~/.bashrc は読みません。
しかし、
source temp.sh
として実行した場合は ~/.bashrc を読んでいるので、
seq 関数が使えます。
source temp.sh でseqが通り
./temp.shで通らない理由は、
回答番号:No.5 さんの回答でわかりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Linux バイナリ実行できない cannot execute binary file”"
C言語・C++・C#
-
シェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。
UNIX・Linux
-
シェルスクリプト内のcdで、カレントディレクトリを変えるには?
UNIX・Linux
-
4
スクリプトのエラー「unexpected EOF while looking for matching `'」の解決法は?"
UNIX・Linux
-
5
IOException ってどういうときに起こるのでしょうか?
Java
-
6
シェルコマンドの 2>&1 とはどういう意味でしょうか?
その他(プログラミング・Web制作)
-
7
shellスクリプトから別のshellスクリプトを呼び出す方法
その他(プログラミング・Web制作)
-
8
Bシェル 変数にある文字列が含まれているか調べる方法
その他(コンピューター・テクノロジー)
-
9
sedなどで、特定の文字列の後の文字列を抽出したい
その他(プログラミング・Web制作)
-
10
外部レポジトリとは
UNIX・Linux
-
11
シェルスクリプトでオラクルのエラーメッセージを取得するには
Oracle
-
12
リダイレクト >> を複数のファイルに同時に行いたい
UNIX・Linux
-
13
空白を含んだシェル変数の代入
UNIX・Linux
-
14
grepで検索文字列が完全一致した行だけ取り出す方法
UNIX・Linux
-
15
Tera Termでのコマンド流し込みの際の文字欠け、不要文字挿入
サーバー
-
16
CUIでの、$(ドルマーク)の使い方
UNIX・Linux
-
17
bashで、gotoのようなラベルによるジャンプ構文をしたいのですが、方法をご教授ください。
UNIX・Linux
-
18
tarコマンドの末尾の「-」ハイフンの意味
UNIX・Linux
-
19
バックスラッシュの意味がわかりません
UNIX・Linux
-
20
Linuxでシェルスクリプトがフルパスだと実行できない
UNIX・Linux
関連するQ&A
- 1 [シェルスクリプト内で bashコマンド後のコマンドが実行されない]
- 2 シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。
- 3 シェルスクリプトに.bashrcからsourceコマンドでaliasの設定を読み込む方法について
- 4 シェルスクリプト(bash)によるファイルの編集
- 5 Unixとlinuxのシェルスクリプトについての質問です。 Unixで動くシェルスクリプトを、lin
- 6 シェルスクリプト:while文のリダイレクトはサブシェルで実行されますか
- 7 シェルスクリプトのbashとperlについて
- 8 シェルスクリプト bashのtestコマンドが動きません
- 9 以降のスクリプトを実行せずに終わるシェルスクリプトの書き方
- 10 bashシェルスクリプトで変数を使う
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
自分の画面が他人にみられてい...
-
5
ubuntu 初期化について
-
6
最近のPCにLINUXを入れてISDNの...
-
7
Dirコマンドでフォルダ内ファイ...
-
8
メモ帳(notepad.exe)の起動オプ...
-
9
画面が真っ黒のままです
-
10
Linuxカーネル
-
11
エクセル!常に隣のシートを参...
-
12
マウントしたUSBメモリに書き込...
-
13
ubuntuでマイクラサーバーを開...
-
14
書き込み権限が無いためコピー...
-
15
batファイルの結果をテキストに...
-
16
HOSTキーってどこですか?
-
17
ftpでファイルを転送時、タイム...
-
18
/ が何時の間にか「Read-only f...
-
19
R1C1参照形式変更後「名前の重...
-
20
2つのOSを別々のHDDに入れたが...
おすすめ情報