2016-02-26 7 views
1

Я разрабатываю сценарий оболочки bash. Он имеет множество функций, и один из них - определить, находится ли сетевая карта в режиме мониторинга. Не уверен, есть ли для этого метод «pro». Мой рудиментарный метод работает, но имеет проблему. Является следующей функцией:Проблемы с stdout

function monitor() { 

    WIFI="wlan0" #hardcoded wlan0 for the example 
    mode=`iwconfig $WIFI|cut -d ' ' -f 6` 

    if [[ $mode == "Mode:Monitor" ]]; then 
     echo "Your interface $WIFI is in monitor mode already" 
     return 
    fi 
    #Here is the rest of the function... not relevant 
} 

Проблема заключается в том, что на экране выводится сообщение о начале команды, и я не хочу ничего напечатать на экране. Таким образом, сначала я подумал, чтобы перенаправить стандартный вывод в/DEV/нуль делает это:

mode=`iwconfig $WIFI|cut -d ' ' -f 6 > /dev/null 2>&1` 

Но если я могу это сделать, это перестать работать ... Я думаю, потому что он нуждается в стандартный вывод в трубу одной команды другой для работы.

Если я выбираю карту с монитором уже, все в порядке. Проблема в том, что сетевой интерфейс не находится в режиме мониторинга (например, eth0), он печатает это:

eth0 нет беспроводных расширений.

Что я могу сделать, чтобы использовать stdout для трубы и предотвратить печать чего-либо на экране?

Заранее спасибо.

Cheers.

+1

стандартных вывод 'iwconfig' не собираются ваш TTY, но STDERR есть. Попробуйте 'mode = $ (iwconfig 2>/dev/null $ WIFI | cut -d '' -f 6)' –

ответ

2

Silence stderr вашей команды iwconfig (с помощью 2> /dev/null переназначения):

iwconfig $WIFI 2> /dev/null | cut -d ' ' -f 6 
+0

Ты рок чувак !! Оно работало завораживающе! Благодаря! :) – OscarAkaElvis

+1

@OscarAkaElvis, пожалуйста, прочитайте https://stackoverflow.com/help/someone-answers –

0

Не включайте > /dev/null в командной подстановки, так как это предотвращает захват ничего в переменной mode.

Если ваша цель состоит в захвата стандартный вывод и молчание STDERR в переменной $mode:

mode=`iwconfig "$WIFI" 2>/dev/null | cut -d ' ' -f 6 ` 

Если ваша цель состоит в захвата как стандартный вывод и стандартный поток ошибок, а ваша попытка решения предполагает:

mode=`iwconfig "$WIFI" 2>&1 | cut -d ' ' -f 6 ` 

Примечание: Поскольку @ nsilent2 2 очек в комментариях и в their answer, размещения 2/dev/null или 2>&1 имеет решающее значение здесь: это iwconfig что потенциально дает выход Stderr, поэтому Перенаправление должно быть применено к так ли, а не к cut.

Вообще, если вы хотите применить перенаправление к трубопроводу в целом, вы можете использовать команды группировку; например .:

mode=`{ iwconfig "$WIFI" | cut -d ' ' -f 6; } 2>/dev/null` 
+0

Спасибо за ваши быстрые ответы ...Я попробовал оба: mode = $ (iwconfig 2>/dev/null $ WIFI | cut -d '' -f 6) и mode = $ (iwconfig "$ WIFI" | cut -d '' -f 6 2> & 1) ... тот же результат. Он печатает «eth0 no wireless extensions». когда используется non monitor iface. :/ – OscarAkaElvis

+1

Вы перенесите перенаправление в неправильное место. Вам не нужно перенаправлять 'stderr' команды' cut', но 'iwconfig' – nsilent22

+0

@ nsilent22: Отличная точка, спасибо - исправлено. – mklement0