作者 主題: Shell 控制權....  (閱讀 6178 次)

0 會員 與 1 訪客 正在閱讀本文。

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 於: 2005-03-23 04:06 »
在 "OLS3 (臥龍小三)" 的 "Shell基礎" 文章中提到

引用
命令可分為二大類:

bash 內建的指令
程式

如果是 bash 內建的指令, 則由 bash shell 負責回應; 若是程式, 則 shell 會找出該程式, 然後將控制權交給核心, 由核心執行該程式, 執行完之後, 再將控制權交回給 shell.


小弟在一個shell(a.sh)中呼叫了另一個shell(b.sh)....
如果我想要在b.sh開始執行的當下要讓a.sh取回控制權....
應該是要怎麼做啊....
望各位先進不吝賜教....

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
Shell 控制權....
« 回覆 #1 於: 2005-03-23 07:19 »
不知你要的是否將 b.sh 以 background 方式執行?

或可在 a.sh 中試試:
b.sh &
然後在最後的 exit 之前一行, 加上 wait .

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #2 於: 2005-03-24 03:28 »
謝N大....

的確....
利用 b.sh& 便初步能得到我要的結果....
不過 a.sh 對 b.sh好像就無所謂的 '控制權' 了....
到底還是學的不夠,得再好好努力才行....

兩年前接了點將家的MIS後便對他們的機器抱持了莫大的興趣....
一直想用台PC搞出一個卡拉OK伴唱系統....
昨兒個早上5:00 利用 HTML+PERL+SHELL ....
終於弄出個初步的雛型....可以點歌+播放+錯誤判斷....
有沒有人對這方面有興趣的呀....

不過接下來的路還很長遠....
要開始 K 'GTK' 跟 'QT' 了....
希望有經驗的前輩多多提攜,照顧....
小弟先行謝過了....

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
Shell 控制權....
« 回覆 #3 於: 2005-03-24 07:13 »
不知你所謂的"控制權"是怎樣的呢?
能否說清楚一些?
只要構思沒問題, 我想大家都可給你參考的.

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #4 於: 2005-03-24 12:14 »
午安好:

初步做法是一台LINUX作為接受點播歌號及播放*.dat的機器....
安裝mplay,啟動httpd,可執行CGI....

開機後啟動兩個SHELL --> 1.sh(接受資料) 及 2.sh(背景執行播放) ,兩者皆為無限迴圈....
1.sh判斷是否有資料輸入,產生播放*.dat內容的可執行SHELL($list.play),檔名由1開始累加....
2.sh判斷是否有$list.play存在,若有便順序執行,執行完便刪除該$list.play,繼續執行下一$list.play....
若已播放完畢而又無新資料傳入,便在無限迴圈裡等待下一筆資料傳入....

另,一台Windows做為輸入歌號的機器,利用HTML+CGI將輸入的歌號寫入$list.play丟給linux的1.sh ....
未來是要將兩台電腦結合成一台,....

目前利用 & 讓 2.sh在background 方式執行沒有問題,因為2.sh是無限迴圈....
未來繼續加入新功能的話,2.sh必須要讓1.sh能夠控制,不能再是無限迴圈了....

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
Shell 控制權....
« 回覆 #5 於: 2005-03-24 14:54 »
對啊. 不要讓 2.sh 跑迴圈如何?
而是讓 1.sh 去呼叫直行, 結束後返回 1.sh .
不知可否?

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #6 於: 2005-03-24 15:33 »
下午好:

1.sh會產生

-rwxr-xr-x    1 root     root        10716  3月 24 13:16 1.play
-rwxr-xr-x    1 root     root        10716  3月 24 13:16 2.play
-rwxr-xr-x    1 root     root        10716  3月 24 13:16 3.play
-rwxr-xr-x    1 root     root        10716  3月 24 13:16 4.play

2.sh :
代碼: [選擇]
#! /bin/sh

        sn="1"
for ((;;))
do
        CHK_FILE=$sn.play
        if [ ! -e $CHK_FILE ]; then
        #echo -n "'$CHK_FILE' is not found."
        sleep 1

        else
        sh $sn.play
        rm -f $sn.play
        sn=$(( $sn + 1 ))
        fi
done


2.sh 在背景一直等待1.sh建立 $sn.play 來執行....
而2.sh是不能結束的,如果2.sh結束的話....那$sn就不見了呀....

其實,是因為我還沒學到傳參數給2.sh這部分....
才疏學淺....讓您見笑了.... :oops:

 :wink:  :wink:

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
Shell 控制權....
« 回覆 #7 於: 2005-03-24 16:05 »
傳參數我也不太會....

不過你可在 1.sh 這樣寫:
2.sh arg1 arg2 arg3 ....

然後在 2.sh 裡用 $1 $2 $3 ... 來抓就是了.

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #8 於: 2005-03-24 17:10 »
下午好:

就是這個光....就是這個光....
或許我可以做到 1.sh+2.sh ==> OK.sh .... :D

請教一個問題:
代碼: [選擇]
<input type=radio name=s1 value=1 CHECKED>Kplay
<input type=radio name=s1 value=2>Nplay


當我點'Kplay'時,我該怎麼抓s1的值呢....!?
代碼: [選擇]
if ($FORM{'s1'} eq '1' )
    {$nsnd = "1:2:1:0";}
else {$nsnd = "1:1:1:0";}


這樣好像不管如何都不是 '1'....
我單獨 print "$s1";
結果$s1都是空值....

thucop

  • 憂鬱的高中生
  • ***
  • 文章數: 148
    • 檢視個人資料
Shell 控制權....
« 回覆 #9 於: 2005-03-24 18:05 »
haha!
這個東西很好玩!
我有一個想法,
有沒有可能,讓 cgi 可以去執行播法的程序,
這支程式可以去監看目前有沒有歌在播,
如果沒有你就直接播歌,
如果有就如先前的方法,寫出播歌清單!
那這時候有在播歌的程序做完之後,
再檢查有沒有播歌清單存在,有就繼續播!
沒有就結束掉!

另外,還有切歌的功能!
也可以用 cgi 去kill 掉正在播歌的 process,
那就可以繼續播下首歌!

還有插播的功能,
那就是序號編法要用點技巧了!

好好玩!改天也拿玩玩看!
~ 學無止境 ~~

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #10 於: 2005-03-24 18:26 »
晚安:

    您說的好像跟我做的是一樣的東西....

    因為還不會寫GTK跟QT的程式....
    所以目前拆成兩台PC....
    一台LINUX接受點歌及播歌....
    一台Windows純粹點歌....

    由於播歌是LINUX....
    所以切歌直接按LINUX的'Esc'就行了....

    至於插播....
    得先搞定CGI的部分....

thucop

  • 憂鬱的高中生
  • ***
  • 文章數: 148
    • 檢視個人資料
Shell 控制權....
« 回覆 #11 於: 2005-03-24 19:58 »
引述: "crazyfeng"
晚安:

    您說的好像跟我做的是一樣的東西....

    因為還不會寫GTK跟QT的程式....
    所以目前拆成兩台PC....
    一台LINUX接受點歌及播歌....
    一台Windows純粹點歌....

    由於播歌是LINUX....
    所以切歌直接按LINUX的'Esc'就行了....

    至於插播....
    得先搞定CGI的部分....


這本來就是你的 idea 啊!
我只是突然想到一些東東而已!
GTK QT 是 ????
~ 學無止境 ~~

crazyfeng

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
Shell 控制權....
« 回覆 #12 於: 2005-03-25 00:27 »
GTK 是GNOME的視窗程式設計....
QT 是 KED的視窗程式設計....

努力猛啃中.... :-?

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
Shell 控制權....
« 回覆 #13 於: 2005-03-25 12:39 »
若用 shell script 寫 , 小弟應該會採用 1.sh + 2.sh

2_only_name_can_kill.sh
代碼: [選擇]

Show="now_play.data"
Play_list="music_list.data"

test ! -f $Show && echo 0 > $Show

Now_number=$(cat $Show)
((Now_number++))
echo $Now_number > $Show
Now_number=$(head -$(cat $Play_list) | tail -1)
/bin/聽說有指令列撥放?#123;式 $Now_number


1.sh
代碼: [選擇]
Show="now_play.data"
Play_list="music_list.data"

while true;do
echo 'r/R 第一首?#125;始
d/D 刪除第幾首
p/P 本首歌重來
s/S 暫停 ??
 '

read choise
case choise in
r|R)
echo 0 > $Show
killall ./2_only_name_can_kill.sh
./2_only_name_can_kill.sh &
;;
d|D)
cat -n $Play_list
echo -n '弟幾首'
read Tmp_str
Tmp_str="$Tmp_str"d
sed "$Tmp_str" $Play_list > "$Play_list"_tmp
cat "$Play_list"_tmp > "$Play_list"
;;
p|P)
Now_number=$(cat $Show)
((Now_number--))
echo $Now_number > $Show
killall ./2_only_name_can_kill.sh
./2_only_name_can_kill.sh &
##((Now_number=Now_number-2)) 上一首?#125;始
##不?#91;不減下一首
##跳到 n 首找出行 - 1
;;
s|S)
   不知道有沒有方式能讓背景執行暫停??
   Ctrl + z ; bg ; fg , 都是在終端人在控制時才能用 ... 不知道對不對??
;;
代碼: [選擇]

*)
killall ./2_only_name_can_kill.sh
./2_only_name_can_kill.sh &
;;
esac

done


會想藉由 tmp 檔來傳值 , 直覺是 ... 有時候電話來時 , 就要關音樂囉