bash nie przetwarza deterministycznie znaku wieloznacznego gwiazdki

3

Przypadkowo dodałem użytkownika do mojego systemu bez katalogu domowego (zapomniałem umieścić flagi -d i -m w useradd). Zamiast usuwać użytkownika i zaczynać od nowa, próbowałem po prostu mkdir katalogu domowego i samodzielnie skopiować pliki z / etc / skel. Jednak otrzymałem następujący dziwny błąd:

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

Jednak następujące dwa polecenia działają zgodnie z oczekiwaniami:

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

Czy ktoś może rzucić nieco światła na to, dlaczego otrzymałem ten błąd początkowy.

osobliwości
źródło

Odpowiedzi:

3

Katalog / etc / skel zwykle zawiera tylko ukryte pliki, to znaczy te, których nazwa zaczyna się od kropki. Rozszerzenie powłoki *nie obejmuje ukrytych plików, chyba że ustawiono taką opcję. W przypadku bash ta opcja jest ustawiona za pomocą shopt -s dotglob.

W twoim przypadku /etc/skel/*nic się nie rozwija, więc powłoka pozostawia argument jako /etc/skel/*, ale nie ma pliku o tej nazwie.

garyjohn
źródło
5

Gdy wyrażenie glob ( /etc/skel/*) rozwija się do braku plików, domyślnie wyrażenie pozostaje w poleceniu jako zwykły ciąg. W tym przypadku nie ma plików, ponieważ wszystkie pliki w / etc / skel są plikami kropkowymi. Próbowałeś więc skopiować dosłowny plik „*” w / etc / skel, a ten plik nie istnieje.

Zobacz http://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion

Glenn Jackman
źródło