%post
インタプリタラインを#!/bin/csh
(オプションなし)に設定してrpmで実行されるcshインストール後のスクリプトがあります-f
。/etc/csh.cshrc
2つのマニュアルページによると、残りのスクリプトが実行される前にファイルを読み取る必要があります。bsd-csh(1)そしてtcsh(1)。/etc/csh.cshrc
スクリプトが正しく機能するために依存する特定のシステム全体の環境変数とエイリアスが定義されています。予想される動作は、cshがスクリプトを実行するときに最初にシステム全体の定義をインポートし、次にスクリプトが正常に実行されることです。
これは少なくとも特定の条件下で動作します。 cshスクリプトは常に%post
rpmセクションで同じ方法で呼び出されます。ただし、アプリケーションrpmのインストールをどのように行うかによって、スクリプトが期待した変数を取得できず、エラーが出ることもあり、/etc/csh.cshrc
まったくソースが出ないことがありそうです。インストールは、sudo、ssh、cronを介してrootログインシェルで実行することも、他のプロセスから起動することもできます。そのうちの少なくとも1つは/etc/csh.cshrc
ブロックソースにわずかな違いをもたらします。-f
マニュアルページには、この問題を引き起こすオプション以外には何も表示されません。
答え1
$HOME
違いは、環境変数が欠落していることを示しています。環境で定義されていない場合、$HOME
cshまたはtcshは起動ファイルをまったくインポートしません。 cshは、欠落している変数を与えられた$HOME
コマンドラインオプションとまったく同じに解釈します。-f
これは、シェルの起動ファイルと~/.cshrc
ユーザーのホームディレクトリを考慮すると意味があります。定義されていない~/.login
場合、$HOME
これらのユーザー固有のファイルをロードできません。ただし、$HOME
定義されていない場合、cshはシステム全体の起動ファイルやユーザー固有の起動ファイルを含むすべての起動ファイルの検索をスキップします。
cshスクリプトを実行する前に$HOME
ユーザーの実際のホームディレクトリであるか空の一時ディレクトリであるかにかかわらず、有効なディレクトリを定義すると、cshソースコードが/etc/csh.cshrc
期待どおりに機能します。
この機能を説明または説明する文書が見つかりませんでしたが、bsd-cshとtcshのソースコードはこの動作を確認します。
答え2
cshが実際に実行されていることを確認してください!
which csh
cshの場所を取得するには実行します。
走るls -l /path/returned/by/which/csh
私の場合はcsh
何とかtcsh
。