我正在写一个应该对用户"透明"的bash脚本.它从用户读取命令并拦截它们,只允许其中一些命令由bash执行,具体取决于某些条件.它(基本上)的工作原理如下:
while true; do
read COMMAND
can_be_done $COMMAND
if [ $? == 0 ]; then
eval $COMMAND
if [ $? != 0 ]; then
echo "Error: command not found"
fi
fi
done
Run Code Online (Sandbox Code Playgroud)
问题是,当命令失败时,您还会将内容打印到控制台.但是,如果我将结果保存在变量中并且只在它没有失败时打印它,就像这样:
RESULT=$(eval $COMMAND)
Run Code Online (Sandbox Code Playgroud)
然后还有另一个问题:特殊格式丢失(例如,"ls --color"不再显示颜色)
我的问题是:如果成功,有没有办法让命令打印到STDOUT,但如果失败则有/ dev/null吗?
你真的需要第二部分,用错误信息替换命令的输出吗?Linux命令打印自己的错误消息,这些消息不一定是"找不到命令".您将隐藏真正的错误(权限被拒绝,文件未找到,内存不足,段错误等),并且通常会出现错误的错误消息(未找到命令).
如果删除该检查,则可以将循环简化为如下所示:
while true; do
read -e COMMAND
if can_be_done "$COMMAND"; then
eval "$COMMAND"
fi
done
Run Code Online (Sandbox Code Playgroud)
read -e使用readline获取命令,使提示更像shell(例如↑,↓对于历史).command; if [ $? == 0 ]; then更习惯地写成if <command>; then.