Tcsh

抑制標準輸出上的啟動消息?

  • May 24, 2012

我正在使用tcsh,並且必須獲取組.cshrc文件。此文件回顯一些消息,這對於普通 shell 來說很好,但會導致scprsync. 我可以看到採用幾種形式之一的解決方案,但無法實現其中任何一種。

僅在適當時執行回顯

我已經搜尋了rsync手冊tcsh頁,但是我找不到任何在從 ssh/rsync/whatever 呼叫時保證設置或取消設置的變數。$PROMPT與正常相同,$shlvl為 1,其他看起來都沒有希望。

重定向到標準錯誤

rsync/scp/etc 似乎並不關心來自 stderr 的內容,所以如果可以的話,我會

echo $MSG >&2

但這甚至不適用於外殼。相反,它寫入$MSG一個名為2. 當我查看歷史時,似乎有些東西(xterm?readline?tcsh?)正在插入空格,所以實際執行的是

echo $MSG > & 2

因此,考慮到 tcsh 的實際輸入,觀察到的行為是有意義的。

重定向到 /dev/stderr

我也試過

echo $MSG > /dev/stderr

哪個適用於ssh,但對於scpand rsync,我收到消息 ’ /dev/stderr: Permission denied.’ ,關鍵區別似乎在於文件的符號連結位置。添加ls -l /dev/stderr /proc/self/fd/2到 cshrc 文件顯示

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

但是,由於權限被拒絕消息出現在 stderr 上,scp/rsync 程序能夠完成它的工作,所以我可以接受這個解決方案,但不想收到這個虛假的錯誤消息。

我使用的成語是

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

請注意,它是拼寫$prompt(小寫),而不是$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.

如果$prompt總是設置,那麼您的啟動文件之一可能會無條件設置它。

它也應該進入if ( $?prompt )測試內部,例如

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

   # interactive commands here
endif

測試輸出是否是終端也可能有效。

if ({ test -t 0 }) then
   # interactive commands here
endif

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