Prompt

根據 cwd 更改提示格式

  • February 11, 2014

我用tcsh。我想根據我所在的目錄或我的環境的其他關鍵方面更改我的提示格式(著色/突出顯示)。

我沒有足夠的外殼黑客知道如何做到這一點。

目前目錄的所有權

如果我在“我的”目錄之一中(即,我是目前工作目錄的所有者),那麼它應該具有正常外觀。但是,如果我在其他人的目錄中(我cd為其他人的工作區域提供了很多支持),那麼我希望提示看起來明顯不同。

這是為了提醒我不要在別人的目錄中輸入不禮貌的命令。(想想make clobberp4 sync等)

關鍵環境變數設置

我的環境的另一個重要資訊是是否設置了某個環境變數,稱之為 SWDEV。如果未設置 SWDEV,則我的腳本和流來自其預設位置。但是,如果設置了這個變數,那麼它將作為我的腳本和流的新根位置,其行為會根據該位置的腳本而改變。

重要的是要提醒這個變數的設置,以免我期待“正常”行為,而是心不在焉地從新位置執行程式碼。

我沒有弄清楚如何在 shell (tcsh) 中本地執行此操作,但我確實使用 Perl 腳本解決了這個問題。

使用 Perl 腳本,您可以使用複雜的邏輯來檢查您是否擁有 $cwd、設置了哪些環境變數等。然後,讓腳本列印您想要的提示字元串。

tcsh 有一個特殊的precmd別名,每次在列印提示之前都會執行該別名。所以,有一個 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,還。)

在此處輸入圖像描述

好吧,如果外部腳本是可接受的解決方案,您可以執行以下操作:

#!/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 % ";
}

引用自:https://unix.stackexchange.com/questions/75856