vine-users ML アーカイブ



[vine-users:056050] Re: スクリプトのエラー

  • From: Kanji Naito <rxc13337@xxxxxxxxxxx>
  • Subject: [vine-users:056050] Re: スクリプトのエラー
  • Date: Sat, 23 Nov 2002 01:12:57 +0900
 Kanji Naitoです。

>> $ source alarm
>
>[alpha@etower alpha]$ source alarm
>82707
>82701                                  <<とりあえず結果は良いですね。
>82707
>82767
>[alpha@etower alpha]$ source alarm
>82713
>82767
## 上記一部修正しております



>[alpha@etower alpha]$  . alarm
>bash: 08: value too great for base (error token is "08") <---これがなぜ出る
>のかわかりません

## この件は、回答があったようなので、省略(私も知りませんでした。)

>> 
>> #/bin/sh のため、
>> 子シェル(sh)で実行しているので、export の結果が、
>> 子シェルと同時に消えるでは、ないでしょうか。
>> 
>> # export は、子シェルには、引き継がれるが、親シェルには無関係と
>> # 記憶しております。
>> export の代わりに、適当なファイルに結果を書き出せば、
>> うまく動作しないでしょうか?

>適当なファイルに書き出すとはどういうことでしょうか?

A1# if [ $current_time -gt $next_alarm_time ] ;then
B1# if [ $current_time -gt $(cat ~/next_alarm_time) ] ;then

A2#     export next_alarm_time=$((current_time+60))
B2# echo $((current_time+60)) > ~/next_alarm_time

変数に書き出さずにファイルに書き出すには、B2の様に変更します。
読み出す場合は、B1の様に変更すれば、良いとおもいますが試していません。

## 出力が数字だけなら、$(cat file)で数値として読み出せたと思うが?

>それとsourceとドット+スペースはどういうコマンドでしょうか? 調べたけれど全然
>わからないのです。

sourceとドット+スペースは、同じ意味を示します。
## 下のテストをご理解いただいたうえで、
##  . file.sh を source file.sh と置き換えて試してみてください。

 sourceとドット+スペースで実行した場合は、直接シェルにコマンドを指示した
ことと同じになります。

 (1A)のコマンドを(1B)のshで作業をしている事とすると、以下の様になります。

 (2A)のshスクリプトは(2B)のshを呼び出し(echoと同じ位置)で
shスクリプトに書かれたコマンドを実行して、shスクリプトファイルの
最後で(2B)のshは、終了してしまいます。
この時点で、(2B)のshでexportした結果も同時に消えてしまいます。

 (3A)の . で実行すると(2B)のシェルを呼び出さずに(1B,3B)のshで作業をして
いるところでshスクリプトに書かれたコマンドを実行します。
(#/bin/sh はコメントとして無視される。)

$ cat file.sh
#/bin/sh
export OUT="test"
echo $OUT
$ ls -l
-rwxr-xr-x  1 u  g  41 Nov 23 00:37 file.sh


$ export OUT="non"  (1A)
$ env |grep OUT
OUT=non
$ ./file.sh         (2A)子シェルを育成して実行
test
$ env |grep OUT
OUT=non
$ . file.sh         (3A)
test
$ env |grep OUT


$ ps axf
    1 pts/0    S      0:00 -bash
    2 pts/0    S      0:00  \_ sh               (1B,3B)
    3 pts/0    S      0:00      \_ sh           (2B)
    4 pts/0    S      0:00          \_ echo


## だらだら書いたから余計に混乱するかも