我正在學習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