web-dev-qa-db-ja.com

適切な許可なしにアスタリスクを展開することはできません

誰かが私に次のことを説明できますか?

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

ですから、ここではアスタリスクを使用できません。私はSudoコマンドで試してみましたが、「アクセスが拒否されました」ではなく「そのようなファイルはありません」というエラーが表示されます...

Sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

しかし、*を使用しない場合、最終的には機能します

Sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file
17
imagineerThis

*ワイルドカードの展開を行っているシェルは、入力したシェルです。シェルにディレクトリ内のファイルのリストを読み取る権限がある場合、シェルは/temp/sit/build/*/temp/sit/build/fileに展開し、Sudoを引数ls-lおよび/temp/sit/build/fileで実行します。シェルが/temp/sit/build/*に一致するものを見つけられない場合(一致がないため、またはシェルに一致を表示する権限がないため)、パターンをそのままにし、Sudoが次のように呼び出されます引数ls-lおよび/temp/sit/build/*

/temp/sit/build/*というファイルはないため、lsコマンドは、その名前を渡した場合に文句を言います。 lsはワイルドカードを展開しないことを思い出してください。これはシェルの仕事です。

読み取り権限のないディレクトリでワイルドカード展開を行う場合は、Sudoを呼び出すシェルではなく、Sudoで開始されるシェルで展開を行う必要があります。 Sudoはシェルを自動的に起動しません。明示的に実行する必要があります。

Sudo sh -c 'ls -l /temp/sit/build/*'

ここではもちろん、代わりにSudo ls -l /temp/sit/build/を使用できますが、それは他のパターンに一般化されません。

まれなケースですが、シェルのグロビングを無効にしていないことを再確認する必要があり、No such file or directoryワイルドカード(*)。

例えば:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

小切手 help set詳細については。

1
kenorb