Несоответствие stderr перенаправления между tcsh и другими оболочками

Можно использовать ps -ef для рассмотрения дочернего pid родительский идентификатор является тем, который сделал разветвление или порождение. Вы могли использовать watch запускать скрипт регулярно и делать значить Вас.

8
26.01.2019, 17:43
2 ответа

Это несоответствие на самом деле является первой причиной в списке причин, по которым csh программирование считается вредным.

Или что, если вы просто хотите выбросить stderr и оставить stdout. В одиночку? Довольно простая операция, да?

cmd 2>/dev/null

Работает в панцире Борна. В csh, вы можете сделать только жалкий попытка подобная:

(cmd > /dev/tty) >& /dev/null

Но кто сказал, что вонючка моя? Так что это неправильно. Вот так просто операция НЕ МОЖЕТ СОБЫТЬ в сШ.

12
27.01.2020, 20:09

2> не является оператором в tcsh , вы используете оператор > и передача 2 в качестве аргумента vi . Этот кажется нормальным, поскольку обе - xxx и - версия выходят из vi .

Из tcsh (1) :

   > name
   >! name
   >& name
   >&! name
           The file name is used as standard output.  If the file does not
           exist then it is created; if the file exists, it is  truncated,
           its previous contents being lost.

           If  the shell variable noclobber is set, then the file must not
           exist or be a character  special  file  (e.g.,  a  terminal  or
           `/dev/null')  or an error results.  This helps prevent acciden‐
           tal destruction of files.  In this case the `!'  forms  can  be
           used to suppress this check.

           The  forms  involving  `&' route the diagnostic output into the
           specified file  as  well  as  the  standard  output.   name  is
           expanded in the same way as `<' input filenames are.

Таким образом, вы можете использовать > & для перенаправления как stdout, так и stderr ( «диагностический вывод» ).Не существует «очевидного» способа только перенаправить stderr, и это давний недостаток оболочки C, известный обходной путь:

(vi --xxx > /dev/tty) >& /dev/null

Это работает путем перенаправления stdout на / dev / tty (текущий tty) в подоболочке (паренсы делают то же, что и в оболочках bourne), а вывод подоболочки (который является только stderr, поскольку мы перенаправили stdout) перенаправляется на / dev / null (но это может быть что угодно, например файл).

Я не знаю, какова ваша цель, но в случаях, когда вы не можете быть уверены в том, какую оболочку использует пользователь, я обнаружил, что обычно лучше всего установить ее явно; ракушек больше, чем "борн и сш", таких как рыба,также могут быть небольшие несовместимости между различными оболочками Борна и / или некоторые конструкции могут «работать» в одной оболочке, а не в другой ...

4
27.01.2020, 20:09

Теги

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