Estou usando tcsh
e tenho que criar um arquivo .cshrc
do grupo. Este arquivo ecoa algumas mensagens, o que é bom para shells normais, mas causa problemas com programas como scp
e rsync
. Eu posso ver a solução tomando uma das poucas formas, mas não consigo implementar nenhuma delas.
Execute apenas ecos quando apropriado
Eu vasculhei as páginas rsync
e tcsh
man, mas não consigo encontrar nenhuma variável com garantia de ser configurada ou não definida quando é chamada de ssh / rsync / whatever. $PROMPT
é igual ao normal, $shlvl
é 1 e nada mais parece promissor.
Redirecionar para stderr
rsync / scp / etc não parece se importar com o que vem stderr, então se eu pudesse, eu
echo $MSG >&2
Mas isso nem funciona com o shell. Em vez disso, ele grava $MSG
em um arquivo chamado 2
. Quando eu olho através do histórico, parece que alguma coisa (xterm? Readline? Tcsh?) Está inserindo espaços, então o que foi realmente executado foi
echo $MSG > & 2
Assim, o comportamento observado faz sentido, dada a entrada real para o tcsh.
Redirecionar para / dev / stderr
Eu também tentei
echo $MSG > /dev/stderr
O que funciona para ssh
, mas para scp
e rsync
, recebo a mensagem ' /dev/stderr: Permission denied.
' e a principal diferença parece ser onde o arquivo é vinculado por link. Adicionando ls -l /dev/stderr /proc/self/fd/2
ao arquivo cshrc mostra
# For ssh
lrwxrwxrwx 1 root root 15 Apr 11 09:58 /dev/stderr -> /proc/self/fd/2
lrwx------ 1 <me> <mygrp> 64 May 24 14:34 /proc/self/fd/2 -> /dev/pts/6
# For scp
lrwxrwxrwx 1 root root 15 Apr 11 09:58 /dev/stderr -> /proc/self/fd/2
l-wx------ 1 <me> <mygrp> 64 May 24 15:07 /proc/self/fd/2 -> pipe:[378204842]
No entanto, como a mensagem de permissão negada aparece no stderr, o processo scp / rsync é capaz de fazer sua parte, portanto, posso viver com essa solução, mas prefiro não receber essa mensagem de erro falsa.