Por que o prompt é diferente para 'tcsh', dependendo de ser chamado como 'tcsh' ou 'csh'?

0

Instalei o pacote tcsh no Ubuntu 15.10 e o prompt é diferente dependendo de como invoco tcsh .

Primeiro, no Ubuntu 15.10, tcsh e csh são realmente o mesmo executável:

$ cmp /bin/tcsh /bin/csh && echo 'same' || echo 'different'
same

$ /bin/tcsh
hostname:/tmp>

$ /bin/tcsh -f
>

Considerando que com /bin/csh termina com um sinal de porcentagem

$ /bin/csh
hostname:/tmp%

$ /bin/csh -f
%

Eu não defini um arquivo .cshrc ou .tcshrc . O tcsh está inspecionando o primeiro elemento do argv para determinar o que usar como caractere final do prompt?

O arquivo /etc/csh.cshrc contém lógica para alterar o prompt se o programa for invocado como tcsh , mas não está claro por que a configuração desse prompt alteraria o último caractere de > para % . Este arquivo também é ignorado se o sinalizador -f for fornecido.

# /etc/csh.cshrc: system-wide .cshrc file for csh(1) and tcsh(1)

if ($?tcsh && $?prompt) then

    bindkey "\e[1~" beginning-of-line # Home
    bindkey "\e[7~" beginning-of-line # Home rxvt
    bindkey "\e[2~" overwrite-mode    # Ins
    bindkey "\e[3~" delete-char       # Delete
    bindkey "\e[4~" end-of-line       # End
    bindkey "\e[8~" end-of-line       # End rxvt

    set autoexpand
    set autolist
    set prompt = "%U%m%u:%B%~%b%# "
endif
    
por Gregory Nisbet 19.04.2016 / 01:06

1 resposta

1

Não vejo isso na página man, mas o código-fonte verifica se o programa é invocado como tcsh ou não. Se for , o código define o prompt conforme observado na pergunta:

HIST = '!';
HISTSUB = '^';
PRCH = tcsh ? '>' : '%';    /* to replace %# in $prompt for normal users */
PRCHROOT = '#';             /* likewise for root */
word_chars = STR_WORD_CHARS;
bslash_quote = 0;           /* PWP: do tcsh-style backslash quoting? */

A lógica do programa é bastante fácil de ler:

    {
        char *t;

        t = strrchr(argv[0], '/');
#ifdef WINNT_NATIVE
        {
            char *s = strrchr(argv[0], '\');
            if (s)
                t = s;
        }
#endif /* WINNT_NATIVE */
        t = t ? t + 1 : argv[0];
        if (*t == '-') t++;
        progname = strsave((t && *t) ? t : tcshstr);    /* never want a null */
        tcsh = strncmp(progname, tcshstr, sizeof(tcshstr) - 1) == 0;
    }

e

static const char tcshstr[] = "tcsh";

Por isso, não passaria no teste se fosse nomeado tcsh10 , por exemplo.

    
por 19.04.2016 / 01:18

Tags