簡體   English   中英

在較新版本的bash中導出的功能不再起作用(帶有sed e標志)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM