Tcsh

為什麼tcsh的提示不同取決於它是作為tcsh還是csh呼叫

  • April 18, 2016

tcsh在 Ubuntu 15.10 上安裝了該軟體包,提示因我呼叫的方式而異tcsh

首先,在 Ubuntu 15.10 上,tcsh實際上csh是相同的執行檔:

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

$ /bin/tcsh
hostname:/tmp>

$ /bin/tcsh -f
>

/bin/csh它以百分號結尾

$ /bin/csh
hostname:/tmp%

$ /bin/csh -f
%

我沒有設置.cshrc.tcshrc文件。是否tcsh檢查 argv 的第一個元素以確定將什麼用作提示的最後一個字元?

如果程序被呼叫,該/etc/csh.cshrc文件確實包含更改提示符的邏輯tcsh,但不清楚為什麼以這種方式設置提示符會將最後一個字元從 更改>%-f如果提供了標誌,該文件也會被忽略。

# /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

我在手冊頁中看不到它,但原始碼檢查程序是否被呼叫tcsh。如果,則程式碼會按照問題中的說明設置提示:

HIST = '!';
HISTSUB = '^';
PRCH = tcsh ? '>' : '%'; /* 為普通使用者替換 $prompt 中的 %# */
PRCHROOT = '#'; /* 同樣對於根 */
word_chars = STR_WORD_CHARS;
bslash_quote = 0; /* PWP: tcsh 風格的反斜杠引用嗎?*/

程序邏輯相當容易閱讀:

{
圖表;

t = strrchr(argv[0], '/');
#ifdef WINNT_NATIVE
{
char *s = strrchr(argv[0], '\\');
如果(S)
t = s;
}
#endif / * WINNT_NATIVE * /
t = t ? t + 1 : argv[0];
if (*t == '-') t++;
progname = strsave((t && *t) ? t : tcshstr); /* 永遠不要空值 */
tcsh = strncmp(progname, tcshstr, sizeof(tcshstr) - 1) == 0;
}

static const char tcshstr[] = "tcsh";

tcsh10因此,例如,如果它被命名,它就不會通過測試。

引用自:https://unix.stackexchange.com/questions/277393