gpt4 book ai didi

bash - 将命令传递给 Bash 中的函数

转载 作者:行者123 更新时间:2023-12-04 18:36:19 24 4
gpt4 key购买 nike

我正在创建一个设置 bash 脚本,以便我可以快速设置我的服务器。
在运行函数内部我想传递命令,然后运行函数将验证该命令是否成功。

function run () {
if output=$( $1 );
then printf 'OK. («%s»)\n' "$output";
else printf 'Failed! («%s»)\n' "$output";
fi
}

printf 'Setting up «uni» as system group...'

run " if [ ! $( getent group uni ) ];
then sudo addgroup --system uni;
else echo 'Group exists.';
fi "
然而,这会导致错误: setup.sh: line 5: if: command not found当我这样做时它工作正常,但我想消除重复代码,因为我有很多命令:
if output=$(
if [ ! $( getent group uni ) ]; then sudo addgroup --system uni; else echo 'Group exists.'; fi
);
then printf 'OK. («%s»)\n' "$output";
else printf 'Failed! («%s»)\n' "$output";
fi
我究竟做错了什么?

最佳答案

将代码传递给函数的安全方法是......将该代码封装在另一个函数中。

run() {
local output
if output=$("$@"); then
printf 'OK. («%s»)\n' "$output";
else
printf 'Failed! («%s»)\n' "$output";
fi
}

printf 'Setting up «uni» as system group...'

step1() {
if [ ! "$(getent group uni)" ]; then
sudo addgroup --system uni;
else
echo 'Group exists.';
fi
}

run step1
如果您的代码不涉及流控制运算符(并且符合“简单命令”的定义),您甚至不需要这样做;以上 run定义(使用 "$@" 而不是 $1 ),
run sudo addgroup --system uni
...将按原样正常工作。

使用 evalsh -c使您面临严重的安全问题;见 BashFAQ #48有关高级概述,请参阅 BashFAQ #50讨论为什么不应该将代码作为文本传递(以及避免首先需要这样做的首选方法!)

关于bash - 将命令传递给 Bash 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65908369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com