Как перенаправить вывод какой-либо команды?

На самых невстроенных установках Linux и многих встроенных установках, /dev находится в поддержанной RAM файловой системе, не в корневом разделе. Актуальнейшие установки имеют /dev как tmpfs файловая система, с udev демоном, создающим записи при уведомлении ядром, что некоторые аппаратные средства доступны. Недавнее предложение ядра возможность наличия /dev смонтированный как devtmpfs файловая система, которая непосредственно заполняется ядром.

Я думаю, что Ubuntu 12.10 все еще использует udev. Так или иначе, /dev не должен быть на корневом разделе (как показано выводом df /dev), это должно быть в его собственной файловой системе. Вы случайно размонтировались /dev?

Первая вещь, которую необходимо попробовать, состоит в том, чтобы перезагрузить: это должно смонтироваться /dev правильно. Перед этим проверьте, что Вы не добавили запись для /dev в /etc/fstab (не должно быть никакой строки с /dev во втором столбце).

Даже с /dev на корневом разделе можно создать /dev/sdb путем выполнения

cd /dev
sudo MAKEDEV sdb

Но не наличие /dev управляемый динамично не стабильная конфигурация, Вы столкнетесь с подобными проблемами для большого количества других аппаратных средств.

14
29.01.2014, 03:42
3 ответа

Когда Вы работаете:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Вы чрезвычайно только перенаправляете вывод Потока 1 (т.е. stdout) к /dev/null.

Это прекрасно, когда Вы хотите перенаправить вывод, который производится нормальным осуществлением программы. Однако в случае, если Вы также хотите перенаправить вывод, вызванный всеми ошибками, предупреждениями или отказами, необходимо также перенаправить stderr или поток Стандартной погрешности к /dev/null.

Один способ сделать это предварительно ожидает количество потока, который Вы хотите перенаправить к оператору перенаправления, > как это: Command 2> /dev/null

Следовательно, Ваша команда была бы похожа:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

Но, заметьте, что мы уже перенаправили один поток к /dev/null. Почему не просто автожелезнодорожные перевозки на том же перенаправлении? Bash позволяет нам делать это путем определения потокового числа, к которому можно перенаправить к. 2>&1.

Заметьте & символ после оператора перенаправления. Это говорит оболочку, которая, что появляется затем, не имя файла, а идентификатор для потока вывода.

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

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

Иначе, в котором можно достигнуть полной тишины, путем перенаправления всех потоков вывода к /dev/null использование этого ярлыка: &>/dev/null (или перенаправление к файлу журнала с &>/path/to/file.log).

Следовательно, запишите свою команду как:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline
28
27.01.2020, 19:50
  • 1
    Ага &>/dev/null это. Спасибо всем за мгновенную справку! А-ч –  operalala 28.01.2014, 21:10
  • 2
    Be careful with the redirection operators, their order matters a lot., но Вы не включали пример фактического использования 2>&1 –  Izkata 29.01.2014, 00:55
  • 3
    я забыл добавлять это! Отредактированный ответ для отражения примера. Когда у меня будет немного больше времени на моих руках, я объясню, как упорядочивание работает также. –  darnir 29.01.2014, 22:57

Необходимо перенаправить оба стандартных вывода (> или 1>) и стандартная погрешность (2>):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

или, перенаправьте тот к другому:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
9
27.01.2020, 19:50
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

Примеры

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

Ускорение ping

В зависимости от Вашего ping реализация Вы можете быть ограничены единственным количеством -c 1. Некоторые реализации позволят Вам понизиться это, но необходимо по существу ожидать плохих поисков к тайм-ауту. Таким образом вместо использования ping Вы могли бы хотеть использовать fing вместо этого.

замедление сбоя ping

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

fing намного быстрее для сбоя

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014
8
27.01.2020, 19:50
  • 1
    я использовал бы time команда, чем вручную вычислительная разница во времени с date: time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; } –  Ruslan 29.01.2014, 13:44
  • 2
    @Ruslan - спасибо, я сделал это этот путь b/c, я хотел вывод date. Это легче, IMO, для кого-то еще для чтения сгенерированного вывода. –  slm♦ 29.01.2014, 15:22

Теги

Похожие вопросы