私は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 % ";
$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
。