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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Linuxについて質問です。 引数に指定されたアクセスログのファイルからアクセス数が多い順に上位3つ 1 2023/02/03 03:46
- その他(プログラミング・Web制作) linuxについて質問です 1 2023/02/06 19:55
- UNIX・Linux Linuxについて質問です。 シェルスクリプト名をdiff.shとして、以下のように2つのテキストフ 1 2023/02/03 20:06
- オープンソース php-Laravelのインストールについて 1 2022/08/13 01:08
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
bashでシングルクォート内の変...
-
ubuntu(linux)のシャットダウン...
-
AWSでSSH接続をしたいのですが...
-
tarで纏める際に、複数場外した...
-
shellscript内のコマンドを、su...
-
ubuntuで デイスク/deb/loopと...
-
Postfixでドコモメールに送信す...
-
ファイル・フォルダーの削除方法
-
ログにserver reached MaxReque...
-
Windowsのローカルディレクトリ...
-
cronの@rebootでのdateコマンド...
-
UbuntuにROSをインストールしたい
-
ntpq -pの結果が全てstratum 16...
-
Linux Mint 日本語入力できなく...
-
ssl_request_logの必要性について
-
次の要件を満たすにはどのよう...
-
Ubuntuサーバーでメールを受信...
-
至急です。kubuntu24.04ltsをUS...
-
Windowsのパソコンを使って仮想...
-
ssl_error_logのエラー内容(AH...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashでシングルクォート内の変...
-
ubuntu(linux)のシャットダウン...
-
Ububtuでファイル共有できない...
-
WineのRufusでデバイスを検知す...
-
ubuntuで デイスク/deb/loopと...
-
複数のフォルダを同時に参照し...
-
linuxのIMEの件
-
ViエディタとVimエディタの違い...
-
LinuxでSSH接続について
-
AWSでSSH接続をしたいのですが...
-
Kindleアプリについて
-
ubuntuのシャットダウンが進ま...
-
このエラー内容について教えて...
-
Ubuntu on Xorgのログインについて
-
linuxサーバーのキャッシュをク...
-
shellscript内のコマンドを、su...
-
VirtualBox ゲストOSにPC内蔵HD...
-
LinuxMintが突然フリーズする
-
Linux Mint 日本語入力できなく...
-
ssl_error_logのエラー内容(AH...
おすすめ情報