ディレクトリのみを実行すると、PATHはbashとcshで異なる動作をしますか?

ディレクトリのみを実行すると、PATHはbashとcshで異なる動作をしますか?

私たちは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追加された新しいコンテンツをすべて選択できます。

おすすめ記事