一、問題:
我有一個 bash 腳本(到目前為止是 2 行),它呼叫一個 perl 腳本來生成第二個 bash 腳本。我希望第一個 bash 腳本運行 perl 腳本并執行第二個(生成的)bash 腳本。
2. 背景:
這個動態生成的 bash 腳本在 windows 上對于 ubuntu bash(通過 wsl)和 cygwin bash 都可以正常執行(只要只有一個 bash 命令):
$(perl -e 'print "ls -ltr"')
3. 我嘗試過但不起作用的方法(第 1 部分):
以下嘗試不起作用,因為 bash 不會將分號或我的換行符解釋為新行并抱怨(例如)pwd 不是 ls 的選項。
$(perl -e 'print "ls -ltr;pwd")
$(perl -e 'print "ls -ltr
pwd")
$(perl -e 'print "ls -ltr \n pwd")
有沒有辦法讓上面的這些例子起作用?我喜歡它,因為代碼確實是一行代碼,而且我不會為每個命令創建一個新的 shell。
4. 我嘗試過但不起作用的方法(第 2 部分):
perl -e 'print `ls -ltr`; print `pwd`'
嗯,實際上這確實有效,但我不喜歡這種方法,因為它很慢,而且它排除了在生成的代碼中使用 bash for 回圈的可能性。它還排除了在 bash 腳本開始時創建和修改環境變數以及以后使用它們的可能性。
5. 讓 perl 將 bash 腳本寫入檔案是否可行?
那么讓我的 perl 動態地將 bash 腳本寫入一個(唯一且動態命名的)檔案并讓這個 perl 腳本將檔案名列印到 stdout 以便第一個(呼叫)bash 可以存盤臨時檔案名,使用“ chmod x" 并呼叫(執行)它,然后將其洗掉。
沒有更簡單的方法嗎?看起來我們應該能夠以某種方式使第 1 部分中的示例起作用。
謝謝
齊格弗里德
uj5u.com熱心網友回復:
因此,動態生成 Bash 代碼幾乎從來都不是一個好主意;撰寫適用于常見情況的代碼生成邏輯太容易了,但在您沒有想到的情況下卻表現得非常糟糕。(這一點尤其正確,因為檔案名可以包含奇怪的字符——空格、星號、反斜杠、換行符、引號、首字母連字符,等等——但即使你沒有在代碼生成邏輯中使用檔案名,也有很多這可能會出錯。)
但是如果你打算這樣做,那么你執行代碼的方式——你告訴 Bash 讀取包含代碼的字串并將它傳遞給解釋;和換行等的完整決議器鏈的方式——正在使用eval:
eval "$(perl -e 'print "ls -ltr; pwd"')"
# the above is equivalent to
# eval 'ls -ltr; pwd'
# which in turn is equivalent to
# ls -ltr; pwd
或者,您可以使用bash -c呼叫單獨的 Bash 副本來運行此命令:
bash -c "$(perl -e 'print "ls -ltr; pwd"')"
# the above is equivalent to
# bash -c 'ls -ltr; pwd'
# which is roughly equivalent to
# ls -ltr; pwd
# except that it runs in a separate shell
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/369527.html
