2017-06-06 223 views
0

我有一個腳本假設script.sh 它有兩個腳本里面傳遞變量從一個腳本到另一個shell腳本

sh script1.sh & 
sh script2.sh & 
wait; 
echo $var1 
echo $var2 

我想這兩個變量(VAR1,VAR2)parallaly運行印刷在運行script.sh

cat script1.sh 

var1=1; 
export $var1 

cat script2.sh 

var1=1; 
export $var1 
+0

它是否嚴格定義它應該運行哪個shell解釋器/操作系統或解決方案應該是可移植的? – mpasko256

+0

unix bash shell @ mpasko256 – abhisek

+0

不是它的某種副本 https://stackoverflow.com/questions/42067435/how-to-return-a-variable-from-one-shell-script-to-another -script?rq = 1 問題? – mpasko256

回答

0

事情浮現在腦海:

  1. 如果你使用bash,您可以使用點運行腳本:

    .script1.sh

    它會在同一個環境中運行的腳本,所以你可以修改「調用」的環境變量腳本。

  2. 如果它是一個單一的輸出數據時,可以只打印到內腳本和截距在外部腳本的標準輸出:

    inner_result =`script1.sh`

  3. 如果它是一個數值,可以返回它作爲腳本的退出代碼(但是我不推薦這種方法,因爲它是在腳本開發一種不好的做法)

編輯:

  • 使用臨時文件來存儲結果,然後將其刪除(但取決於操作系統,命名的隊列可能是最好的專用溶液)
  • +0

    script1.sh和script2.sh返回單個輸出數據。但是兩者必須一起觸發,並且在等待呼叫後打印val1和val2 – abhisek

    +0

    我錯過了需要腳本需要並行運行的要求,因此添加了第四個解決方案 – mpasko256

    +0

    如果您只需要bash 4.x支持,我實際上建議coprocesses。順便說一句,因爲1-2沒有解決問題*根本就沒有*和3需要通過個人PID到'等待'退出狀態綁回他們,我會建議大量修改這個答案。 –

    1

    這可以與在bash 4.x版協進程完成後,如果你的script1script2寫的變量到stdout:

    #!/usr/bin/env bash 
    #    ^^^- Must be bash, not /bin/sh; must NOT start this script with "sh name". 
    
    start_seconds=$SECONDS 
    run_script1() { sleep 5; echo "one"; } # replace these with your script1 or script2 
    run_script2() { sleep 5; echo "two"; } 
    
    coproc coproc_script1 { run_script1; } 
    coproc coproc_script2 { run_script2; } 
    
    read -u "${coproc_script1[0]}" var1 
    read -u "${coproc_script2[0]}" var2 
    echo "End time: $((SECONDS - start_seconds)); var1=$var1; var2=$var2" 
    

    如果數值進行平行不運行,您End time將是10個或更多。相反,它應該在實踐中是56以上代碼。

    相關問題