【问题标题】:Bash IF exit code redirect errorsBash IF 退出代码重定向错误
【发布时间】:2017-01-08 16:48:36
【问题描述】:

我现在正在编写一个 bash 脚本,其中包含一个检查目录是否包含内容的语句。

现在,代码是

if [ "$(ls -A $APPLICATIONS)"  ]; then
    do something
else
    do something else
fi

但是,当文件夹确实为空时,我希望 ls 的错误被抑制。通常,它会说“没有这样的文件或目录”,但我想将其重定向到 /dev/null。

我试过了

if [ "$(ls -A $APPLICATIONS &> /dev/null)"  ]; then

这确实像我想要的那样将所有内容重定向到 /dev/null,但它也会导致找不到目录(本质上导致退出代码 1)。

这样做的正确方法是什么?

【问题讨论】:

  • 空目录不应导致错误。如果目录本身不存在,您只会收到该错误,如果它是空的则不会。
  • 除非$APPLICATIONS 包含通配符,例如/path/to/directory/* 而不仅仅是目录名。
  • @Barmar 问题的另一个方面是我的目录本应位于的位置有它自己的问题。 掌心

标签: bash if-statement redirect scripting exit-code


【解决方案1】:

&> 重定向 stdoutstderr。要仅重定向 stderr,请使用 2>

if [ "$(ls -A $APPLICATIONS 2> /dev/null)"  ]; then

【讨论】:

  • 哎呀。我们去吧。这就是问题所在。
【解决方案2】:

APPLICATIONS 来自哪里?当你运行你的脚本时它被设置成什么?

我发现针对命令运行 if 语句的最佳方法是执行以下操作:

if command; then
    do something
fi

在您的情况下,假设APPLICATIONS 的格式为/path/to/folderlocal/folder,您可以执行以下操作:

#!/bin/bash

APPLICATIONS="$1"

[[ -z "$APPLICATIONS" ]] && exit 1    # Exit if APPLICATIONS is not set.

if ls -A -- "$APPLICATIONS"/* &>/dev/null; then
    echo do something    # Directory is not empty
else
    echo do something else     # Directory is empty
fi

【讨论】:

  • 它不会运行ls 命令的输出,因为它被用作test 的参数。
  • 好点,没有方括号会尝试执行它。我会修改我的答案。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多