
私は使用中で、tcsh
グループファイルをインポートする必要があります.cshrc
。ファイルはいくつかのメッセージを反映していますが、これは通常のシェルには問題ありませんが、scp
WindowsやLinuxなどのプログラムでは問題を引き起こす可能性がありますrsync
。解決策がいくつかの形式のうちの1つを取るのを見ることができますが、それらのどれも実装することはできません。
適切な場合にのみechoを実行してください。
rsync
そしてマニュアルページを見てみましたが、tcsh
ssh / rsync / whateverから呼び出されたときに設定または設定解除が保証される変数が見つかりませんでした。$PROMPT
一般1と同じで、$shlvl
残りは有望に見えます。
標準エラーにリダイレクト
rsync/scp/etcはstderrで何が起こるのか気にしないようです。したがって、可能であればそうします。
echo $MSG >&2
しかし、これはシェルでも機能しません。代わりに$MSG
。2
記録を見ると、何か(xterm?readline?tcsh?)が空白を挿入したようで、実際に実行されるのは次のとおりです。
echo $MSG > & 2
したがって、観察された動作はtcshへの実際の入力を考慮すると意味があります。
/dev/stderrにリダイレクト
私も試しました
echo $MSG > /dev/stderr
これはうまくいきますssh
が、メッセージが表示されたscp
場合の主な違いは、ファイルシンボリックリンクの場所のようです。表示するcshrcファイルに追加rsync
/dev/stderr: Permission denied.
ls -l /dev/stderr /proc/self/fd/2
# 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プロセスはそのアクションを実行できるため、この回避策を受け入れることができますが、この偽のエラーメッセージは受け取りたくありません。
答え1
私が使用するイディオムは
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