Какой метод следует использовать для записи сообщений об ошибках в 'stderr' с помощью 'printf' в сценарии bash?

Я хочу направить вывод printfв сценарии bashна stderrвместо stdout. ].

Я неспрашиваю о перенаправлении либо stderr, либо stdoutиз того места, где они в настоящее время маршрутизируются. Я просто хочу иметь возможность отправлять вывод из printfв stderrвместо stdoutпо умолчанию.

Я немного поэкспериментировал и обнаружил, что добавление 1>&2к printf, как показано в примере ниже, делает то, что я хочу. Однако у менянетопыта использования bash.Итак, мой основнойвопрос заключается в том, есть ли «лучший» способ сделать это в bash?

Под «лучше» я подразумеваю, есть ли другой способ сделать это, более широко используемый, более традиционный или более идиоматический? Как бы это сделал более опытный bash-программист?

#!/bin/bash
printf "{%s}   This should go to stderr.\n" "$(date)" 1>&2 
printf "[(%s)] This should go to stdout.\n" "$(date)" 

У меня также есть второстепенныйвопрос. Я спрашиваю не столько потому, что мне нужнознать, сколько потому, что мне просто любопытно и я хотел бы лучше понять, что происходит.

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

Вот пример того, что я имею в виду.

irrational@VBx64:~$ printf "{%s} Sent to stderr.\n" "$(date)" 1>&2 2> errors.txt
{Sat Jun  9 14:08:46 EDT 2012} Sent to stderr.
irrational@VBx64:~$ ls -l errors.txt
-rw-rw-r-- 1 irrational irrational 0 Jun  9 14:39 errors.txt

Я ожидаю, что команда printfвыше не будет иметь вывода, потому что вывод должен идти на stderr, который, в свою очередь, должен идти в файл. Но этого не происходит. А?

28
задан Løiten 17 April 2017 в 15:17
поделиться