cwdに基づいてプロンプト形式を変更する

cwdに基づいてプロンプト形式を変更する

私はtcshを使用します。私が持っているディレクトリや私の環境の他の主な側面に基づいてプロンプト形式(色/強調表示)を変更したいと思います。

私はまだシェルハッカーではなく、これを行う方法がわかりません。

現在のディレクトリの所有権

私が「私の」ディレクトリの1つにある場合(つまり、私が現在の作業ディレクトリの所有者である場合)は、通常の外観でなければなりません。しかし、私が他の人のディレクトリにいる場合(私は他の人の作業領域に多くのサポートを提供します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

ここに画像の説明を入力してください。

関連情報