2>
não é um operador em tcsh
, você está usando o operador >
e passando 2
como um argumento para vi
. Isso aparece para ficar bem, já que --xxx
e --version
exit vi
.
De 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.
Portanto, você pode usar >&
para redirecionar ambos stdout e stderr ( "output de diagnóstico" ). Não há nenhuma maneira "óbvia" de somente redirecionar o stderr, e essa é uma lacuna de longa data do shell C, uma solução conhecida é:
(vi --xxx > /dev/tty) >& /dev/null
Isso funciona redirecionando stdout para /dev/tty
(que é o tty atual) em uma subshell (os parentes fazem o mesmo que em bourne shells) e a saída da subshell (que é apenas stderr desde que redirecionamos stdout) é redirecionado para /dev/null
(mas isso pode ser qualquer coisa, como um arquivo).
Eu não sei qual é o seu objetivo, mas nos casos em que você não pode ter certeza de qual shell o usuário está usando, descobri que geralmente é melhor defini-lo explicitamente; há mais conchas do que "bourne e csh", como peixes, e também pode haver pequenas incompatibilidades entre diferentes conchas Bourne e / ou algumas construções podem "acontecer" de funcionar em uma concha, e não em outra ...