這裏第一篇文章,但一直是一個潛伏的年齡。我已經搜索了很長時間,但無法找到我想要的東西(許多不需要主題建議它的主題主題......)。不是新的awk或腳本,只是有點生疏:)awk:直接從awk腳本中設置環境變量
我想寫一個awk腳本,它將設置shell env值,因爲它運行 - 另一個bash腳本來拿起和使用後。我不能簡單地使用awk的stdout來報告我想設置的值(即「export whatever = awk cmd here
」),因爲這已經指向awkscript創建的「結果文件」(加上我有多個變量可以導出無論如何,最終的代碼)。
作爲一個例子測試腳本,演示我的問題:
echo $MYSCRIPT_RESULT # returns nothing, not currently set
echo | awk -f scriptfile.awk # do whatever, setting MYSCRIPT_RESULT as we go
echo $MYSCRIPT_RESULT # desired: returns the env value set in scriptfile.awk
scriptfile.awk內,我已經試過(不sucess)
1 /)建設和直接執行即席字符串:
{
cmdline="export MYSCRIPT_RESULT=1"
cmdline
}
2 /)使用系統功能:
{
cmdline="export MYSCRIPT_RESULT=1"
system(cmdline)
}
...但這些不起作用。我懷疑這兩個命令是在awk執行的shell的內部創建一個子shell,並且按照我的要求(通過觸摸文件作爲測試來證明),但是一旦「cmd」/系統調用完成,子shell就會死亡,不幸的是採取我已經設定的任何東西 - 所以我的環境設置變化不會從「awk的調用者」的角度來堅持。
所以我的問題是,你如何真的在awk 內直接設置env變量,以便調用進程可以在awk執行完成後訪問這些env值?它實際上可能嗎?
除了上面的adhoc/system方法之外,我已經證明對我來說是失敗的,我看不出如何做到這一點(除了將這些值寫入某個「隨機」文件的某個地方以供拾取和讀取調用腳本,無論如何imo是有點骯髒),因此,幫助!
歡迎所有意見/建議/意見!
不行。這是操作系統環境的一個基本規則,子進程可以改變它們的**環境,但不改變其父代的環境。你可以做的最好的是,(從shell腳本)'myParentVar = $(echo「$ myParentVar」| awk'{sub(/ xxxx /,「yyyy」,$ 0); print $ 0}')'(where sub (...)'是一個佔位符,用於對$ myParetntVar進行任何修改。祝你好運。 – shellter 2012-08-16 14:04:40
thx for the reply。我擔心這會是這種情況(父母/孩子的環境設置和影響範圍),所以認爲我將不得不使用這些env變量的暫存文件來訪問調用bash腳本。 thx用於確認我以爲無論如何:( – user1603289 2012-08-16 14:19:17
我也有這個問題,我所做的是寫awk輸出到一個臨時文件,然後找到臨時文件Works。不知道它是否優雅,但仍然非常unixy – qodeninja 2015-04-04 20:06:55