如何将 stderr 重定向到 if 条件内的变量?重击

如何将 stderr 重定向到 if 条件内的变量?重击

我尝试获取标准错误通信mkdir -p $FINAL_BACKUP_DIR并通过 发送消息logger

它使日志更加完整,例如用户将知道他没有权限或$FINAL_BACKUP_DIR不存在。

if ! mkdir -p $FINAL_BACKUP_DIR; then
    logger -t $LOGGER_TAG "Cannot create backup directory in $FINAL_BACKUP_DIR. Standard error communicate. Backup canceling." 1>&2
    exit 1;
fi;

我尝试这样的事情:

if ! mkdir -p $FINAL_BACKUP_DIR 2>> ${test1}; then
    logger -t $LOGGER_TAG "Cannot create backup directory in $FINAL_BACKUP_DIR. Backup canceling. $test1" 1>&2
    exit 1;
fi;

但这个解决方案在两个方面对我不起作用。当我test1更早创建test1=0或没有创建时。

我使用 Ubuntu 14.04。

答案1

/dev/null是“扔掉东西”的标准装置。

所以

some_command 2> /dev/null

会将错误从 发送some_command/dev/null- 即丢弃错误。

因此:

if ! mkdir -p $FINAL_BACKUP_DIR 2> /dev/null
then
  logger -t $LOGGER_TAG "Cannot create backup directory in $FINAL_BACKUP_DIR. Backup canceling."
  exit 1
fi

请注意,您也不需要所有这些额外的;字符:-)

编辑:

您还可以将错误定向到输出并捕获变量中的结果并测试该变量是否为空。这样就可以向用户报告原因

result=$(mkdir -p $FINAL_BACKUP_DIR 2>&1)
if [ -n "$result" ]
then
  logger -t $LOGGER_TAG "Cannot create backup directory in $FINAL_BACKUP_DIR. Backup canceling: $result"
  exit 1
fi

答案2

尝试

if ! mkdir -p $FINAL_BACKUP_DIR > ${test1} 2>&1
then
    logger -t $LOGGER_TAG "Cannot create backup directory in $FINAL_BACKUP_DIR. Backup canceling. $(< ${test1})" 
    exit 1;
fi;

在哪里

  • > ${test1}重定向输出(标准输出)
  • 2>&1告诉 bash 合并 stderr 和 stdout
  • $(< $test1)读取文件内容${test1}
  • 你必须删除${test1}
  • 在 ubuntu 15.X 上测试,有效${test1}

相关内容