標準出力から開始メッセージを表示しませんか?

標準出力から開始メッセージを表示しませんか?

私は使用中で、tcshグループファイルをインポートする必要があります.cshrc。ファイルはいくつかのメッセージを反映していますが、これは通常のシェルには問題ありませんが、scpWindowsやLinuxなどのプログラムでは問題を引き起こす可能性がありますrsync。解決策がいくつかの形式のうちの1つを取るのを見ることができますが、それらのどれも実装することはできません。

適切な場合にのみechoを実行してください。

rsyncそしてマニュアルページを見てみましたが、tcshssh / rsync / whateverから呼び出されたときに設定または設定解除が保証される変数が見つかりませんでした。$PROMPT一般1と同じで、$shlvl残りは有望に見えます。

標準エラーにリダイレクト

rsync/scp/etcはstderrで何が起こるのか気にしないようです。したがって、可能であればそうします。

echo $MSG >&2

しかし、これはシェルでも機能しません。代わりに$MSG2記録を見ると、何か(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

おすすめ記事