仅在命令失败时重定向stdout?

Dem*_*wid 3 linux bash shell

我正在写一个应该对用户"透明"的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吗?

Joh*_*ica 5

你真的需要第二部分,用错误信息替换命令的输出吗?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.
  • 引用可确保正确处理特殊字符和空格.