我正在学习bash。我想创建一个函数,将另一个函数包含在时间脚本文件中,并在子shell中使用sudo -u命令执行它。 我遇到的问题是生成的脚本找不到包装函数,尽管它是在包装函数中导出的。 我在下面添加测试线。有人发现问题,请让我知道。非常感谢你。如何在bash中的函数中导出函数?
main.sh
source "./display.sh"
source "./sudo_wrap.sh"
display_func "load success"
sudo_wrap_func '' 'display_func' '3' '4 5'
输出,display.sh,sudo_wrap.sh和生成的时间文件如下所附,
输出
display_func : load success
export -f display_func
30481: line 5: display_func: command not found
display.sh
function display_func() {
echo "display_func : [email protected]"
}
sudo_wrap.sh
function sudo_wrap_func() {
local sudo_user="${1:-root}"
local function_name="${2:?'function_name is null string.'}"
shift 2
local func_augs=("[email protected]")
local script
# *** script : header ***
script="#!/bin/bash\n"
script="${script}\n"
# *** script : making augments for function ***
script="${script}augs=("
for aug in "${func_augs[@]}"
do
if [[ "${aug}" =~ [[:blank:]] ]]; then
script=" ${script} \"${aug}\""
else
script=" ${script} ${aug}"
fi
done
script="${script})\n"
local tmp_script_file="${RANDOM}"
echo -e "${script}" >> "${tmp_script_file}"
# *** script : calling function with augments ***
echo -e "${function_name} \"\${augs[@]}\"\n" >> "${tmp_script_file}"
echo "export -f "${function_name}"" >&2
export -f "${function_name}"
sudo -u"${sudo_user}" bash "${tmp_script_file}"
rm "${tmp_script_file}"
}
临时生成的文件(在这种情况下,文件名是30481)
#!/bin/bash
augs=(3 "4 5")
display_func "${augs[@]}"
看起来相当复杂。你究竟在努力实现什么? – Robert
检查'tempfile'命令以防止临时竞争。 – Robert
@罗伯特:谢谢你的评论。我想要做的是用sudo命令运行一个函数。我无法运行sudo some_function。所以我把这个函数包装在另一个脚本中,并用sudo命令运行它。顺便说一下,'温度赛'是什么?非常感谢你。 – mora