web-dev-qa-db-ja.com

bashはアスタリスクワイルドカードを決定論的に処理していません

ホームディレクトリのないユーザーを誤ってシステムに追加しました(useraddに-dフラグと-mフラグを入れるのを忘れました)。ユーザーを削除して最初からやり直すのではなく、単にホームディレクトリをmkdirして、/ etc/skelから自分でファイルをコピーしようとしました。ただし、次の奇妙なエラーが発生しました。

user@Host:~$ Sudo cp -rv /etc/skel/* /home/newuser/
cp: cannot stat `/etc/skel/*': No such file or directory

ただし、次の2つのコマンドは期待どおりに機能します。

user@Host:~$ Sudo cp -rv /etc/skel/.bashrc /home/newuser/
user@Host:~$ cp -rv ~/testfolder1/* /testfolder2/

私がその最初のエラーを受け取った理由を誰かが明らかにすることができますか?.

3
curios

/ etc/skelディレクトリには通常、隠しファイル、つまり名前がピリオドで始まるファイルのみが含まれます。 *のシェル拡張には、オプションが設定されていない限り、隠しファイルは含まれません。 bashの場合、このオプションはshopt -s dotglobで設定されます。

あなたの場合、/etc/skel/*は何にも展開されていないため、シェルは引数を/etc/skel/*のままにしますが、その名前のファイルはありません。

3
garyjohn

グロブ式の場合(/etc/skel/*)はnoファイルに展開され、デフォルトでは、式はコマンドにプレーン文字列として残されます。この場合、/ etc/skel内のすべてのファイルがドットファイルであるため、ファイルなしに展開されます。そのため、/ etc/skel内のリテラルファイル「*」をコピーしようとしましたが、そのファイルは存在しません。

http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion を参照してください。

5
glenn jackman