Linuxのスクリプトで、exportコマンドを利用しているのですが、
expoerコマンドの有効範囲についてわかる方がいたらお教えいただけますでしょうか。

有効範囲については、以下のURLを参照しました。
http://www.atmarkit.co.jp/ait/articles/0010/19/n …


例えば、
スクリプトAでは、
export HOGE_KEY='abcd'

スクリプトBでは、
export HOGE_KEY='efgh'

というスクリプトがあって、
両方Cronで実行するときに、
スクリプトAの処理中にスクリプトBが実行されても、
スクリプトの中で定義された変数であるから、スクリプトAの処理には
影響しない(スクリプトAではHOGE_KEY='abcd'のまま)との認識で良いのでしょうか。

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

環境変数は、プロセス固有のデータで、異なるプロセス同士では全く独立で、プロセス内で変更しても他のプロセスには影響しません。



ということで、
>影響しない(スクリプトAではHOGE_KEY='abcd'のまま)との認識で良いのでしょうか。
は正しいです。

プロセス生成時には、環境変数の初期値としては、親プロセスの環境変数が引き継がれます(子プロセスで別のプログラムを起動する場合は変更して伝えることも可能)。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
>環境変数は、プロセス固有のデータで、異なるプロセス同士では全く独立で、プロセス内で変更しても他のプロセスには影響しません。

>ということで、
>>影響しない(スクリプトAではHOGE_KEY='abcd'のまま)との認識で良いのでしょうか。
>は正しいです。

認識が正しいとのことで、安心しました。

お礼日時:2014/09/25 09:10

それこそやってみれば一発でわかるのでは?



//以下a.sh
#!/bin/sh

echo "a";
export HOGE_KEY='abcd';
echo $HOGE_KEY;
./b.sh
echo $HOGE_KEY;
./c.sh
echo $HOGE_KEY;

//以下b.sh
#!/bin/sh

echo "b";
echo $HOGE_KEY;
export HOGE_KEY='efgh';
echo $HOGE_KEY;
./c.sh

//以下c.sh
#!/bin/sh

echo "c";
echo $HOGE_KEY;
export HOGE_KEY='ijkl';
echo $HOGE_KEY;

として、./a.shを実行
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。

今考えると、
スクリプトにsleep入れたり、時刻をログに出力させるようにして
実際にCronで動かせばわかるような内容でした。
失礼しました。

お礼日時:2014/09/25 09:10

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qメールのタグ(○○)の、件名ではなく本文に文章を書き込んだ状態のメールを作りたいのですが。

メールのタグ(<a href="mailto:"○○@△△>○○@△△</a>)の、件名ではなく本文に文章を書き込んだ状態のメールを作りたいのですが。

サブジェクトに指定の文章を入れる方法は、分かります。
(○○@△△?※○○についての問合せ=subject)

では、メールフォームが立ち上がった状態になった時に

【メールアドレス】
○○@△△
【件名】
※○○についての問合せ

【本文】
・名前

・住所

・電話番号

・メッセージ

と、するのはどうすればいいのでしょうか?
うまく文章がまとまらず、分かりづらいかもしれませんが
教えて下さい。よろしくお願い致します。

Aベストアンサー

bodyだそうです。

参考URL:http://www.tagindex.com/html_tag/link/a_mailto_sub.html

QVBAのプログラムで、DIAG = 1# / A(L, L) や R(

VBAのプログラムで、DIAG = 1# / A(L, L) や R(I) = 0# の数字1、0の後についている番号記号#は何を意味しているものでしょうか?

http://www.index-press.co.jp/books/excel/excel-04.pdf

の記事内にあるプログラムで使用されていますが、解説がありません。
調べてみましたがシャープと読まないことぐらいしかわかりませんでした。

どうぞよろしくお願いします。

Aベストアンサー

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。
基本的に、Dim i as Double と宣言すれば i はDouble型に決まって
いますので♯は要りませんが。

稀に Dim i as Variant(何でも型)と宣言したとき、i=1#とすると
Double型として明示代入ができます。
とはいえ、変数の中身が訳がわからなくなるので、こんな書き方は
通常はしません。
プログラム文中を判りやすく見せているだけだと思います。


とはいえ、このプログラムは読みづらいです。
変数、配列のインデクサ、ループカウンタなど殆どが英字2文字以下の
意味のない単語変数なので、可読性のよいプログラムクォリティとしては
よろしくないと思います。

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。...続きを読む

Q#!/bin/gawk -f ???スクリプトの一行目

bashのスクリプトの一行目に、環境に合わせて、
#!/bin/gawk -f
とか
#!/usr/local/bin/bash -f
とか書かないとだめですよね。

環境が変わるごとに(bashのパスが変わるごとに)この部分を書き換えるのが面倒なのですが、よい方法はないものでしょうか?

Aベストアンサー

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル以外から起動される場合はエラーになりますが。直接シェルから起動しなくても例えばC言語のsystem()関数はシェル経由でプログラムを起動するのでこういった場合もOKです。

>・env がスペース付き引数に対応する
env は元々、env VAR=value cmd arg1 arg2 のようにcmd arg1 arg2 を実行する際に環境変数VARにvalueという値を設定してから実行するというコマンドなのでこういう変更はありえないです。envの改造じゃなくてコマンドラインを解析するミニシェルを作ってそれを
#!/bin/minish awk -f のように指定すればOKです。

>・"gawk -f" に対応するコマンド gawkf (?)を用意する(gawk -f を一つの引数にするため)
そのgawkfをどこのディレクトリに置くかという問題が新たに発生します。

ちょっとトリッキーで一部制約もありますが、shはまず間違いなく/binにあるので、gawkの場合、

#!/bin/sh
ZZ==1{ exec sh -c "cat $@ | gawk -f $0" ;}
awkスクリプト
。。。

で、大抵のケースは出来ると思います。上に書いたようにシェルからしか起動しないなら1行目は不要です。

ruby言語だとこういうことを想定してあって、#! ruby という行まで読み飛ばす -x というオプションがあります。この際、rubyに乗り換えては?
#!/bin/sh
exec ruby -S -x $0 $@
#! ruby
rubyスクリプト
。。。

#!の次の文字列をプログラムと見なして、残りの文字列をそのプログラムへの第一引数として、ファイル名を第二引数としてプログラムを実行するというのはbash等のシェルの機能じゃなくてOSカーネルの機能です。カーネルの機能のため、シェルのような複雑なコマンドライン解析機能は組み込まれていません。

一行目が#!で始まらない実行可能ファイルをシェルから起動した場合、シェルスクリプトとして実行されるのでbashからbashスクリプトを実行するなら1行目からいきなりスクリプトを書けばOKです。ただしシェル...続きを読む

Qコマンドプロンプトのスクリプトの意味がわかりません

こんにちは。コマンドプロンプトの意味がわかりません。お教え頂けませんでしょうか?

http://bgworks.info/blog/2007/01/echo_type.html
@echo off
setlocal
set o=a.log
if "%~1"=="" exit /b
cd %1 || exit /b
if exist %o% del %o%
for /r %%a in (*.txt *.htm*) do >> "%~1\%o%" (echo %%a && type "%%a")
endlocal

調べてみて、if exist %o% del %o%までは理解ができました。
次の行の、forループで再帰的に何かをやるところまではわかりましたが、そこからがよくわかりません・・・
ご解説お願い致します!

Aベストアンサー

なんというか「再帰的」の意味を勘違いしているような気もするが, %a に適当なファイル名を放り込んでから考えてください.

Qbashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

bashのシェルスクリプトで

#!/bin/bash -x
CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart
$CMD

としたのですが2行目で既にコマンドが実行されてしまいます。
空白がある場合のコマンドは変数にどう記述したらいいのでしょうか?

Aベストアンサー

CMD="/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart"

eval $CMD

で実行できます。
文字列をコマンドとして認識させればいいのです。


人気Q&Aランキング

おすすめ情報