
私のデフォルトのシェル(Ubuntu)はbashです。ただし、特定のプログラムではCシェルに変更する必要があります。これを行うために.cshrcファイルを設定しましたが、インタラクティブにCシェルに変更すると(この場合はtcshコマンドを使用)、すべてのbashパスを取得することがわかります。
一部のパスが実行する必要があるプログラムと互換性がないため、これらのパスのインポートを停止する方法はありますか?つまり、Cシェル環境にいるときに必要なすべてを.cshrcファイルに定義して制御できるようにしたいと思います。しかし、ログインシェルを永久に変更したくありません。
答え1
環境変数は常に親プロセスから継承されるため、[†]不要.cshrc
な環境変数は手動で設定または削除する必要があります。
setenv PATH /bin:/other/dirs/here:/and/more
unsetenv PS1
これは相互排他的な作業です(残念ながら、英語「or」にはブール特異性がありません)。環境変数をsetenv PATH
設定し、不要な環境を削除します。これを行うと、CPUサイクルだけが無駄になります。代わりに必要に応じて設定してください。 (編集は分割して各ディレクトリ要素にコードを適用するなどの作業がより複雑な作業です。あえて面倒にする必要がありますか?必要に応じて設定してください。)PATH
unsetenv PS1
PS1
unsetenv PATH
setenv PATH ...
PATH
PATH
:
PATH
または、env -i csh
完全に空の環境を使用できます。この場合、.cshrc
必要なすべての項目を設定することをお勧めします(さまざまなデフォルトの環境変数は、に設定またはlogin(1)
等しく設定されますHOME
)。
$ env perl -E 'say $ENV{SHELL}'
/opt/local/bin/mksh
$ env -i perl -E 'say $ENV{SHELL}'
$
[†] Bourneシェルは)を使用してvia Complexを介して子プロセスに渡される変数を表示することで、シェル専用変数を配置した残りの変数PS1
と同じ名前空間シェルの複雑さなしに何が起こっているかについての詳細は、およびマニュアルページを参照してください。export
extern char **environ
environ(7)
execve(2)
答え2
これらのパスのインポートを停止する方法はありますか?
編集中.cshrc
または.tcshrc
何でも許可することをお勧めします。環境変数望ましくない、または値を変更したいオブジェクトが渡されました。tcsh
。その後、設定を解除するか、値を編集してください。それだけです。thrigの素晴らしい答え実施方法について説明しました。
しかし、あなたはできる必要に応じて正確に実行してください。tcsh
不要な環境変数なしで実行するか、別の値を指定してください。
tcsh
あなたが脱出した場合ボーンスタイルシェル良いbash
それからVAR=val
コマンドの直前に書くことができます。このコマンドの環境変数を設定します。たとえば、
PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh
これはいいえ別のコマンドで割り当てを実行するのと同じです(後に改行文字または文字を追加して;
)。これにより、変数が環境にエクスポートされなくなります。サブプロセス同様に、tcsh
次のコマンドの実行が完了しても割り当ては維持されます。
次の方法で複数の環境変数を設定することもできます。
BAR=barval PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh
以下で実行される後続のコマンドでは、環境変数は変更されていませんbash
。
ek@Io:~$ echo "$LANG"
en_US.UTF-8
ek@Io:~$ LANG=C tcsh -c 'echo "$LANG"'
C
ek@Io:~$ echo "$LANG"
en_US.UTF-8
同様に、環境変数に空の文字列を割り当てることができます。
FOO= tcsh
ただし、これは環境から変数を完全に削除するのとは異なります。これには、次のものを使用できます。env
オプション付きコマンド-u
:
env -u FOO tcsh
あなたもできます置く環境変数env
:
env PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh
君は普通そうじゃない必要ただし、構文がサポートされているため、bash
これは不可能です。bash
VAR=val
env
単一のコマンドで複数の環境変数を設定し、変数を設定解除することもできます。つまり、あなたがそうすることを意味しますいいえリンクenv
コマンドが必要です。たとえば、次のように使用できます。
env -u FOO BAR=barval PATH=/sbin:/bin:/usr/sbin:/usr/bin tcsh
実際のコマンドenv
実行は、シンボルを含まない最初の非オプション引数で始まります=
。