저는 tcsh를 사용합니다. 내가 있는 디렉터리나 내 환경의 다른 주요 측면을 기반으로 프롬프트 형식(색상/강조 표시)을 변경하고 싶습니다.
저는 아직 쉘 해커가 아니며 이 작업을 수행하는 방법을 모릅니다.
현재 디렉터리의 소유권
내가 "내" 디렉터리 중 하나에 있다면(즉, 내가 현재 작업 디렉터리의 소유자인 경우) 정상적인 모습이어야 합니다. 그러나 내가 다른 사람의 디렉터리에 있는 경우(나는 다른 사람의 작업 영역에 대해 많은 지원을 제공합니다 cd
) 프롬프트가 상당히 다르게 보이도록 하고 싶습니다.
이는 다른 사람의 디렉토리에 무례한 명령을 입력하지 말 것을 상기시켜줍니다. (생각해 보거나 make clobber
기다리 p4 sync
세요)
주요 환경 변수 설정
내 환경에 대한 또 다른 중요한 정보는 SWDEV라는 특정 환경 변수가 설정되어 있는지 여부입니다. SWDEV가 설정되지 않은 경우 내 스크립트와 프로세스는 기본 위치에서 가져옵니다. 그러나 이 변수가 설정되면 이는 내 스크립트 및 프로세스의 새 루트 위치로 간주되며 해당 위치의 스크립트에 따라 동작이 변경됩니다.
"정상적인" 동작을 기대하지 않고 무심코 새 위치에서 코드를 실행할 수 있도록 이 변수의 설정을 기억하는 것이 중요합니다.
답변1
외부 스크립팅이 적합한 솔루션이라면 다음을 수행할 수 있습니다.
#!/usr/bin/env perl
use Cwd;
my $cwd=getcwd();
$cwd =~ /$ENV{HOME}/ ?
print "$cwd % " :
print "%{\033[1;31m%}CAREFUL\\\!%{\033[0m%} $cwd % ";
$PATH
as 어딘가에 저장 make_prompt.pl
하고 실행 가능하게 만듭니다. 그런 다음 다음에서 ~/.tcshrc
:
alias precmd 'set prompt="`make_prompt.pl`"'
결과는 다음과 같습니다.
또한 다른 디렉터리에서 특정 방식으로 프롬프트를 변경하기 위해 더 많은 조건을 추가할 수도 있습니다.
#!/usr/bin/env perl
use Cwd;
my $cwd=getcwd();
## Here are some colors to choose from
my $red="%{\033[1;31m%}";
my $green="%{\033[0;32m%}";
my $yellow="%{\033[1;33m%}";
my $blue="%{\033[1;34m%}";
my $magenta="%{\033[1;35m%}";
my $cyan="%{\033[1;36m%}";
my $white="%{\033[0;37m%}";
## This resets the color, you need it after each color command
my $end="%{\033[0m%}";
## If you are in $HOME or one of its sub dirs, print a green prompt
if($cwd =~ /$ENV{HOME}/){
print "$green$cwd$end % ";
}
## If you are in /usr or one of its sub dirs, print a red prompt
elsif($cwd=~ /\/usr/){
print "$red$cwd$end % ";
}
## If you are in /etc or one of its sub dirs, print a blue prompt
elsif($cwd=~/\/etc/){
print "$blue$cwd$end % ";
}
## If you're in /root. As you can see, colors can be combined
elsif($cwd=~/\/root/){
print $red . "OY\\! You're not allowed in here\\!" .
$end . $magenta . " $cwd$end % ";
}
## For wherever else, just print a plain prompt
else {
print "$cwd % ";
}
답변2
쉘(tcsh)에서 로컬로 이 작업을 수행하는 방법을 모르지만 Perl 스크립트를 사용하여 문제를 해결했습니다.
Perl 스크립트를 사용하면 $cwd가 있는지, 어떤 환경 변수가 설정되어 있는지 확인하는 등의 복잡한 논리를 가질 수 있습니다. 그런 다음 스크립트에서 원하는 프롬프트 문자열을 인쇄하도록 합니다.
precmd
tcsh에는 프롬프트를 인쇄하기 전에 매번 실행되는 특별한 별칭이 있습니다 . 따라서 Perl 스크립트 "formatPrompt.pl"이 있습니다.
#!/home/utils/perl-5.8.8/bin/perl
use strict;
use warnings;
use Cwd;
# "SWDEV" is an env var special to our environment. Want to be reminded in the prompt of its setting.
use Env qw(SWDEV prompt);
my $prompt = '%U{%m}%~%u> ';
my $prefix = '';
if (defined $SWDEV) {
# set a prompt prefix if special env var is set. use "Boldface" highlighting.
$prefix = "%Bspecial env var SWDEV=$SWDEV%b\\n";
}
if (! -o getcwd) {
# change the highlighting of the prompt if not your dir.
$prompt = '%U{%m}-->%~<--%u> ';
}
$prompt = $prefix . $prompt;
print $prompt;
exit 0;
다음과 같이 정의된 별칭
% alias precmd
set prompt="`perl /home/source/perl/formatPrompt.pl`"
생산될 수 있다
{o-xterm-62}~> setenv SWDEV "/some/special/env/var/value"
special env var SWDEV=/some/special/env/var/value
{o-xterm-62}~> cd /usr
special env var SWDEV=/some/special/env/var/value
{o-xterm-62}-->/usr<--> unsetenv SWDEV
{o-xterm-62}-->/usr<--> cd ~
{o-xterm-62}~>
(SWDEV가 설정되면 그 값이 인쇄되고, 디렉토리가 사용자에게 속하지 않으면 cwd는 -->cwd<--로 둘러싸여 있습니다. %S%~%s와 같은 다른 프롬프트 강조 표시를 시도하십시오. , 그리고 또한 .)
답변3
재미삼아 여기에서 다른 사람들이 본 것을 바탕으로 간단한 설명을 사용하여 if
또 다른 프로토타입을 제공했습니다 make_prompt
.
#!/bin/tcsh
set red="%{\033[1;31m%}"
set green="%{\033[1;32m%}"
set yellow="%{\033[1;33m%}"
set blue="%{\033[1;34m%}"
set magenta="%{\033[1;35m%}"
set cyan="%{\033[1;36m%}"
set white="%{\033[0;37m%}"
set end="%{\033[0m%}"
if ("$dirstack[1]" == "/") then
echo " ${blue}r${magenta}o${cyan}o${green}t${end} "
else if ("$dirstack[1]" =~ "/home/thisguy*") then
echo " ${yellow}Watch this guy out\\!${end} "
else if ("$dirstack[1]" =~ "/hom*") then
echo " ${red}Be mindful of the home dir\\!${end} "
else if ("$dirstack[1]" =~ "/usr*") then
echo " ${magenta}You're in /usr now\\!${end} "
else if ("$dirstack[1]" =~ "/etc*") then
echo " ${green}-=etc=-${end} "
endif
에 들어가는 비트를 사용하여 정보를 자동으로 오른쪽에 정렬하는 대신 .tcshrc
사용하도록 선택합니다 .rprompt
prompt
alias precmd 'set rprompt="`if "$?" == 0 echo "\(ok\)"``if "$?" == 1 echo "\(err\)"``if ("$?" != 0 && "$?" != 1) echo "\($?\)"``make_prompt`"'
간단한 설명도 추가했습니다종료 상태마지막 명령의 값(ok = 0, err = 1, $?
기타)
/home/thisguy
제한 사항은 다른 디렉터리의 개체(예: 여기의 개체)에 대한 스크립트에서 사용자 정의 메시지를 만들 때 특정 순서(특정 항목에서 일반 항목까지)가 필요하다는 것입니다 /home
.