2015-02-10 2 views
0

Независимо от того, что я, кажется, делаю, я не могу получить вывод команды, которая будет назначена переменной в bash. Хотя мой сценарий выполняется поиск без каких-либо ошибок, я не получаю результат я хочу:Bash - Получение вывода команды

# Prompt if the user needs Qt 
echo "" 
echo "Checking for qt5-default." 
echo "" 

OUTPUT="$(sudo dpkg -s qt5-default)" 

echo "OUTPUT:" 
echo $OUTPUT 

... 

OUTPUT никогда ничего не эхо. Однако, если я:

OUTPUT="$(ls -la)"

Затем он работает. Мне интересно, почему.


Вот что я имею в виду:

Failure

Как вы видите, «OUTPUT:» строка приходит после вывода команды, что означает, что выход не был сохранен в переменная, но была запущена в основной оболочке, что меня смущает.

Вот что происходит, когда OUTPUT="$(ls -la)": «ВЫВОД:»

Success

В этом случае приходит раньше, показывая, что команда echo работала правильно.

Любые идеи?

+4

Похоже, что вместо стандартного вывода используется стандартная ошибка. Попробуйте '2> & 1' в конце команды. –

ответ

2
OUTPUT=$(dpkg -s qt5-default 2>&1) 

Должно делать то, что вам нужно. Как отметил Этан, вывод dpkg идет на stderr, а не на stdout.

+0

Да, это работает. –

+0

Если это сработает, не могли бы вы принять ответ? :) – tink

+0

держишься за лошадей, я на нем! –

1

dpkg -s не требуют прав root. В качестве хорошей практики никогда не используйте sudo внутри скриптов, но для привилегий root требуются привилегии root.

О ваш вопрос: почему это происходит? Поскольку sudo работает в подоболочках (скобки $(...) открывает подоболочку)


Постараюсь найти хорошую ссылку о Баше ловушках и субоболочке, я не помню, где я читал об этом. Попробуйте следующее: Subshell Pitfalls

Смежные вопросы