Таким образом, есть некоторые выходные данные из apt-get, которые я не могу перенаправить куда-либо еще. Вот пример того, что я вижу:
sudo apt-get -qq -y --force-yes install cowsay 2>&1 > /tmp/tmp.txt
Это пример команды, которую я запускаю 16.04. Я включил здесь --force-yes
, чтобы смоделировать подходящее предупреждение для будущего использования. теперь я ожидаю, что эта команда перенаправит все на /tmp/tmp.txt
; и большая часть кода делает это. Однако, когда я запускаю его, я получаю следующее:
$ sudo apt-get -qq -y --force-yes remove cowsay 2>&1 > /tmp/tmp.txt
W: --force-yes is deprecated, use one of the options starting with --allow instead.
Как получить предупреждения о перенаправлении и на мой файл?
У Вас есть потоковая команда перенаправления в неправильном месте. Перенаправления анализируются справа налево, поэтому необходимо сначала записать > /tmp/tmp.txt
и затем 2>&1
. Поскольку Вы записали это, это сначала перенаправляет STDOUT в файл и впоследствии перенаправляет STDERR к STDOUT.
Это - корректная команда:
sudo apt-get -qq -y --force-yes remove cowsay > /tmp/tmp.txt 2>&1
Но существует более простая альтернатива! Необходимо не обязательно перенаправить STDERR в STDOUT для получения обоих записанных в файл, существует также оператор, который непосредственно перенаправляет и STDOUT и STDERR в файл: &>
sudo apt-get -qq -y --force-yes remove cowsay &> /tmp/tmp.txt
Объяснение и дальнейшая информация:
> filename
перенаправления STDOUT (поток 1) к filename
2> filename
перенаправления STDERR (поток 2) к filename
&> filename
перенаправления STDOUT и STDERR к filename
Так же, если Вы хотите передать вывод по каналу к второй команде:
|
перенаправления STDOUT (поток 1) к STDIN второй команды2| filename
перенаправления STDERR (поток 2) к STDIN второй команды&| filename
перенаправления STDOUT и STDERR к STDIN второй команды