私はbashを学んでいます。そして、私は一時的なスクリプトファイルに別の関数をラップし、サブシェルで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'コマンドをチェックして、tempレースを防ぐ。 – Robert
@Robert:ありがとうございます。私がしたいのは、sudoコマンドで関数を実行することです。私はsudo some_functionを実行できません。だから私は別のスクリプトで関数をラップし、sudoコマンドで実行します。ところで、「temp race」とは何ですか?どうもありがとうございました。 – mora