考虑以下代码:
#!/bin/env bash
function myfile { echo $* ; }
export -f myfile
find . -type l -exec bash -c 'myfile "{}"' \;
pre Shell Shock补丁我可以从命令行执行最后3行,它可以工作。 Post Shell Shock我需要从脚本中执行代码。
如果我可以从命令行定义函数,只需将find放在脚本中就可以了。
如果我执行env我可以看到列出的函数,但查找行上的bash命令将看不到它。
有什么想法吗?
答案 0 :(得分:1)
检查命令行会话正在使用哪些bash。它可能与使用bash
搜索调用的$PATH
不同。 (即在命令行上键入bash
,或使用#!/usr/bin/env bash
作为shebang行。)
如果你有两个bash可执行文件,一个是shellshock-patched而另一个没有,那么你将无法在两者之间导出函数。
您可以使用bash -c
命令告诉which bash
执行哪个bash。要查看您用作shell的bash,请在/etc/passwd
中查看您的用户名,然后查看最后一个字段。
使用#!/usr/bin/env bash
作为shebang系列有其优点和缺点。根据具体情况,它没有明确显示正在调用哪个bash的事实可以被视为优势或劣势:)
答案 1 :(得分:0)
如果不确切知道你应用了哪个shellshock补丁(显然,它不是最终的正式版本 - 或你是从一个版本的bash调用的话,不能说出它的原因将一个版本的补丁放入带有不兼容补丁的不同解释器中),但我可以给你一个完全不依赖于导出函数的解决方法 - 实际上有几种解决方法。
一个简单的方法就是将函数的定义扩展到传递给子shell的命令中:
#!/bin/env bash
myfile() { echo $* ; }
find . -type l \
-exec bash -c "$(declare -f myfile);"' for x; do myfile "$x"; done' _ '{}' +
另一个是在父shell中完成工作,不需要任何功能:
#!/bin/env bash
myfile() { echo $* ; }
while IFS= read -r -d '' filename; do
myfile "$filename"
done < <(find . -type l -print0)