cwd를 기반으로 프롬프트 형식 변경

cwd를 기반으로 프롬프트 형식 변경

저는 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 % ";

$PATHas 어딘가에 저장 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가 있는지, 어떤 환경 변수가 설정되어 있는지 확인하는 등의 복잡한 논리를 가질 수 있습니다. 그런 다음 스크립트에서 원하는 프롬프트 문자열을 인쇄하도록 합니다.

precmdtcsh에는 프롬프트를 인쇄하기 전에 매번 실행되는 특별한 별칭이 있습니다 . 따라서 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사용하도록 선택합니다 .rpromptprompt

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.

여기에 이미지 설명을 입력하세요.

관련 정보