Как ограничить вывод в сценарии оболочки команды, выполняемой в цикле

#linux #shell #scripting #ubuntu-16.04

#linux #оболочка #сценарии #ubuntu-16.04

Вопрос:

У меня есть сценарий оболочки следующим образом

 #!/usr/bin/env bash


#Packages list

declare -a packages=( git build_essential node )
declare -a packages_status

# installing=`apt-get install -y `
installing="echo "

for i in "${packages[@]}"
do
    packages_status[$i]=$(dpkg-query -W -f='${status}' $i | grep "install ok installed")
    # echo ${packages_status[$i]}
done
  

Строка кода

 packages_status[$i]=$(dpkg-query -W -f='${status}' $i | grep "install ok installed")
  

выдает следующий вывод

dpkg-запрос: не найдено пакетов, соответствующих build_essential

dpkg-запрос: не найдено пакетов, соответствующих узлу

Я хочу, чтобы этот LOC выполнялся без какого-либо вывода.

Ответ №1:

dpkg-query команда выводит ошибки в stderr, а не в stdout.
Итак, вам следует связать два канала перед передачей в grep:

 packages_status[$i]=$(dpkg-query -W -f='${status}' $i 2>amp;1 | grep "install ok installed")
  

Таким образом, скрипт будет выводить только строки «установить ok установлено» для установленных пакетов.

Ответ №2:

Чтобы не видеть вывод ошибки, вы можете перенаправить этот вывод (поток № 2) на NULL устройство:

 Do_Whatever 2>/dev/null
  

Чтобы не видеть никаких выходных данных, вы можете перенаправить обычный вывод (поток № 1) на NULL устройство и перенаправить вывод ошибок туда же:

 Do_Whatever >/dev/null 2>amp;1
  

Комментарии:

1. Спасибо Доминику за ответ. На самом деле я создавал пользовательский скрипт для настройки полной среды разработки в Vagrant. Поэтому я не могу перенаправить весь вывод скрипта на NULL