Tcsh
抑制標準輸出上的啟動消息?
我正在使用
tcsh
,並且必須獲取組.cshrc
文件。此文件回顯一些消息,這對於普通 shell 來說很好,但會導致scp
和rsync
. 我可以看到採用幾種形式之一的解決方案,但無法實現其中任何一種。僅在適當時執行回顯
我已經搜尋了
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
,但對於scp
andrsync
,我收到消息 ’/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