나는 사용 중이며 tcsh
그룹 파일을 가져와야합니다 .cshrc
. 파일은 일부 메시지를 반영하는데, 이는 일반 셸에는 문제가 없지만 scp
Windows 및 Linux와 같은 프로그램에서는 문제를 일으킬 수 있습니다 rsync
. 솔루션이 여러 형태 중 하나를 취하는 것을 볼 수 있지만 그 중 어떤 것도 구현할 수는 없습니다.
적절한 경우에만 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