Supressa as mensagens de inicialização no stdout?

3

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.

    
por Nate Parsons 24.05.2012 / 17:15

1 resposta

2

O idioma que eu uso é

if ( $?prompt ) then
    # interactive commands here
endif

observe que está escrito $prompt (minúscula), não $PROMPT .

% echo $prompt
%U%m%u:%B%~%b%#

% ssh localhost 'echo $prompt'
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Password: 
prompt: Undefined variable.

Se $prompt estiver sempre definido, um dos seus arquivos de inicialização poderá defini-lo incondicionalmente.

Ele também deve estar dentro do teste if ( $?prompt ) , por exemplo

if ( $?prompt ) then
    set prompt='%B%m%b %C3>'

    # interactive commands here
endif

Testar se a saída é um terminal pode funcionar também.

if ({ test -t 0 }) then
    # interactive commands here
endif
    
por 24.05.2012 / 18:07