Как программы выводят в другое место, кроме STDOUT / STDERR? Как этого избежать?

Создать правило udev , которое запускает сценарий, когда адаптер переменного тока подключен и отключен:

/etc/udev/rules.d/powersave.rules
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
15
15.07.2016, 14:23
2 ответа

Есть две проблемы.

Первый - порядок, второй - / dev / tty .

Давайте воспользуемся этим сценарием в качестве примера сценария, из которого мы хотим получить вывод:

test.sh :

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

Теперь давайте посмотрим на вывод команд:

./ testmyscript.sh 2 > & 1> / dev / null :

edada
ttdada

Поскольку порядок оценки - слева направо, мы сначала получаем «перенаправить stderr туда, куда stdout выводит (так , вывод консоли) ". Затем мы получаем «перенаправление stdout на / dev / null . В итоге мы получаем такую ​​ситуацию:

stdout -> / dev / null stderr -> console

Итак, мы все правильно поняли:

./ testmyscript.sh> / dev / null 2> & 1

И мы получаем:

ttdada .

] Теперь мы выполняем «Перенаправить stdout на / dev / null », а затем «Перенаправить stderr туда, куда указывает stdout» (так, / dev / null ). Ура!

Однако у нас все еще есть проблема; программа печатает на / dev / tty . Теперь я не знаю, как исправить такое поведение, поэтому вы, скорее всего, собираетесь требуется скрипт , но, надеюсь, такое поведение будет происходить не слишком часто.

12
27.01.2020, 19:49

Синтаксис, который вы использовали, неверен.

cmd &2>1 >file

будет разделена как

cmd &
2>1 >file

Это будет:

  1. Запуск cmd в качестве фонового задания без перенаправлений
  2. В отдельном процессе (без команды! ) перенаправит stderr в файл с буквальным названием 1 и перенаправит stdout в файл

Синтаксис, который вам нужен:

cmd >file 2>&1

Порядок операций важен. Это будет:

  1. Перенаправить stdout в файл
  2. Перенаправить stderr в &1 - т.е. в тот же файл, что и stdout

В результате оба stderr и stdout будут перенаправлены в файл.

В bash, более простой нестандартный (и поэтому я не рекомендую его, по соображениям переносимости) синтаксис cmd &> file делает то же самое.

41
27.01.2020, 19:49

Теги

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