如何在 bash 脚本中将变量设置为命令的输出,而不在终端中显示命令输出?

如何在 bash 脚本中将变量设置为命令的输出,而不在终端中显示命令输出?

尝试运行以下脚本:

echo "Is autofs Enabled?"
cmd=`systemctl is-enabled autofs`
echo $cmd
if [[ $cmd = "enabled" ]]; then
echo "Yes autofs is enabled"
elif [[ $cmd = "disabled" ]]; then
echo "No autofs is disabled"
else echo "Autofs not found"
fi

如果未安装 autofs,脚本将导致:

Failed to issue method call: No such file or directory
Autofs not found

如果未安装 autofs,脚本的预期输出:

Autofs not found

如何更改脚本以不打印“无法发出方法调用:没有这样的文件或目录”?

编辑: 感谢大家。答案正是我所寻找的。

答案1

将错误流重定向到如何/dev/null

[ $(systemctl is-enabled autos 2>/dev/null) = "enabled" ] && echo true || echo false

附带说明一下,在将输出分配给变量时使用反引号是 shell 可移植性的最低公分母,现代 shell 建议迁移到将命令中的变量分配给$()

答案2

您可以检查 生成的消息 (stdout)systemctl及其退出状态(后者通过$?shell 变量)。您试图避免的错误消息会传递到 stderr,因此如果您想抑制它,则需要重定向该流。非零退出状态可以指示未找到设备或设备已被禁用(请参阅手动的了解更多信息)。

#!/bin/bash -l    
service=$1
echo "Is $service enabled?"
msg=$(systemctl is-enabled "$service" 2>/dev/null) # capture message
res=$? # capture exit code

if [ -z "$msg" ]; then  # message is empty if service not found
  echo "$service not found"
else  # service could be enabled, disabled, static, etc.
  if [ "$res" -eq 0 ]; then # enabled
    echo "Yes $service is enabled: $msg"
  else
    echo "No, $service is disabled"
  fi
fi

将该脚本保存为 tmp.sh,您可以使用各种输入进行测试:

$ ./tmp.sh autofs
    Is autofs enabled?
    Autofs not found
$ ./tmp.sh anacron.timer
    Is anacron.timer enabled?
    Yes anacron.timer is enabled: enabled
$ ./tmp.sh runlevel6.target
    Is runlevel6.target enabled?
    No, runlevel6.target is disabled

考虑到其他各种情况,您可能最好使用case语句来更精细地处理状态,例如,

case "$msg" in
    enabled*)  echo "Yes $service is enabled" ;;
    disabled) echo "No, $service is disabled" ;;
    linked*) # etc..
    ;;
    static*) # etc..
    ;;
esac

相关内容