[英]Exported functions in newer version of bash does not work anymore (with sed e flag)
我看到帶有sed替換命令的e標志的bash導出函數的怪異行為。
我擁有的舊腳本正在使用此功能來傳遞參數以在sed搜索/替換中命令。 但是,這似乎在較新版本的bash上不再起作用。
我已經在裝有cygwin和bash 4.1.16(8)的舊Windows機器上進行了測試,並具有預期的行為:
$ func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/func \0/ge'
test 123
但是,在具有較新版本的bash 4.3.11(1)的linux上,此方法不起作用:
$ func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/func \0/ge'
sh: 1: func: not found
兩台PC的sed版本為4.2.2。
問題是-我是否缺少某些東西或bash的新版本(在Shellshock之后)破壞了此功能(導出功能)? 另外,如果這已損壞,那么我該如何從Windows / cygwin中移走舊腳本,並使它們繼續運行? -是的,我知道我可以通過一些更改來重寫它們。
解決方法:
func() { echo $1 123; } ; export -f func ; echo test | sed 's/.*/bash -c "func" \0/ge'
輸出:
123
實際上,事實證明這是另一個問題, 破折號是默認的/ bin / sh
感謝Cyrus提供的bash -c提示(實際上,我認為這總是ALWAYS直接指定要實際完成工作的shell的另一點)
同時,我已經測試了舊版本的ubuntu livecd-問題仍然存在。 因此,這不是Shellshock修復的錯。 此外,我在執行操作時看到了不同的行為:
... | sed 's/.*/sh -c "func" \0/ge'
比建議的:
... | sed 's/.*/bash -c "func" \0/ge'
而且看起來這僅在使用破折號作為默認外殼的情況下發生了。
因此答案是:
sudo dpkg-reconfigure dash
此后,一切都按預期進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.