私たちはUnixグループへのアクセスを制限するさまざまなサブディレクトリにいくつかのアプリケーションを持っており、実行だけをしたいと思います。たとえば、「chem」グループのメンバーがa.outへの実行専用アクセス権を持つようにするには、次のようにします。
$ ll -d /tmp/dir1
drwx--x--- 2 root chem 18 Oct 20 07:50 /tmp/dir1/
$ ll /tmp/dir1/a.out
-rwx--x--- 1 root chem 8728 Oct 20 07:50 /tmp/dir1/a.out
これで、私(「chem」グループのメンバー)は、bashシェルから私のパスにこのディレクトリを追加してa.outを実行できるようになりました。
$ export PATH=/tmp/dir1:$PATH
$ a.out
This is a test. . .
ただし、tcshでは次のことはできません。
$ set path = ( /tmp/dir1 $path )
$ a.out
a.out: Command not found.
tcshユーザーがa.outを実行できるように、親ディレクトリにグループ読み取り権限を追加する必要がありました(bashはどちらの場合も機能しました)。
$ ll -d /tmp/dir1
drwxr-x--- 2 root chem 18 Oct 20 07:50 /tmp/dir1/
chmod の後にログアウトし、再度ログインして (tcsh の下)、次の操作を行います。
$ set path = ( /tmp/dir1 $path )
$ a.out
This is a test. . .
親ディレクトリに対する読み取り権限は必要ありません。この場合、bashとtcshの間の明らかな動作の違いを説明するためにすべての文書を見てみましたが、運がありませんでした。誰でもこれを説明できますか?しかし、SLES 12とCentOS 7でこのテストを実行しましたが、どちらの場合も同じ動作でした。
答え1
bash
コマンドが実行されるたびに、$ PATHの各ディレクトリ(最初から最後まで)が検索され、そのディレクトリからコマンドを実行しようとします。成功、失敗、またはそのいずれかです。したがって、/tmp/dir1
$ PATHにあり、a.out
そのディレクトリにある場合は実行を試みることができますa.out
。実行権限があるので、bash
実行を試みて/tmp/dir1/a.out
成功します。
csh
は違います。変更(または設定)すると、パスのすべてのディレクトリにあるすべてのエントリのハッシュ$path
テーブルcsh
が作成され、そのディレクトリがパスに表示される順序が記憶されます。デフォルトでは、フルパス名を使用せずにコマンドを実行すると、そのコマンドがパスのどこかにあることを覚えていることをcsh
確認するためにハッシュテーブルを見つけます(パスに複数のディレクトリがある場合はそのパスを選択します)。にリストされている順序で見つかった最初の項目$path
。ハッシュテーブルで見つからない場合、そのコマンドが存在しないと仮定してエラーが発生します。これはずっと前に時間がかかったときに便利でした。パス内のすべてのディレクトリを検索してコマンドを見つけることはもはやそれほど重要ではありませんが、常にそうであり、csh
今日でも同じです。
csh
ハッシュテーブルを構築するには、$path
どの実行ファイルがあるかを正確に知ることが必要です$path
。読み取り権限が拒否されたため、/tmp/dir1
ハッシュcsh
テーブルを構築できず、実行可能ファイルにコマンドがないと見なされます。ディレクトリがまったくありません。そのため、読み取り権限がないと、ディレクトリ内のファイルがcsh
見つかりません。a.out
$path
csh
読み取り権限を持たない $path ディレクトリでコマンドを検索するには、ハッシュ機能をオフにする必要があります。組み込みコマンドを実行してこれを実行できますunhash
。実行すると、ハッシュテーブル機能がオフになり、検索パス内のすべてのディレクトリを試して検索パスとcsh
同様にコマンドを実行できることを確認しますbash
。
csh
このハッシュ動作のもう1つの副作用は、実行可能ファイルを検索パスのディレクトリに追加するかどうかcsh
わからないことです。したがって、emacs
(/usr/local/bin
検索パスにある)を入力するとします。その後、実行しようとしましたがemacs
...コマンドが見つかりませんでした。この問題を解決するには(ハッシュをオフにせずに)、新しいハッシュテーブルセットを構築するようにコマンドを実行するrehash
と、csh
追加された新しいコンテンツをすべて選択できます。