Nie widzę powodu, dla którego -p
flaga mkdir
powinna być domyślnie ustawiona.
-p, --parents no error if existing, make parent directories as needed
To, co widzę, jest nieniszczące. Czy przegapiłem coś ważnego w sposobie, w jaki to działa?
Po drugie, czy istnieje prosty sposób, aby ustawić to jako domyślne zachowanie mkdir
?
command-line
Treffynnon
źródło
źródło
alias mkdir="mkdir -p"
.mkdp
Odpowiedzi:
Jest to opcjonalna funkcja, która nie zawsze jest pożądana - szczególnie w skryptach. W przypadku skryptów weź pod uwagę następujące wady:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, ale biblioteki zależą od / link do rzeczy poniżej/usr/local/lib/GreatSoftware
. Jeśli tego brakuje, skrypt nie powinien kontynuować.Ogólne zachowanie
mkdir
sprawia, że jest to łatwe i naturalne, ponieważ takie sytuacje są zgłaszane i można je od razu złapać.Możesz utworzyć dla niego alias, jeśli chcesz zawsze używać
mkdir -p
w swoich powłokach:(To powinno przejść do twojej
.bashrc
lub jakiejkolwiek konfiguracji używanej przez twoją powłokę.)źródło
alias mkdp="mkdir -p"
Bardziej wskazane byłoby utworzenie nowego aliasu lub funkcji ..bashrc
nie (normalnie) wpływają na ich środowisko.alias rm='rm -i'
.rm -i
pseudonim był zawsze zły - choć może prowadzić do złych nawyków. Z pewnością nie wszystkie aliasy poleceń są równie dobre / złe - rozważls="ls --color=auto"
lubssh="TERM=xterm ssh"
na przykład.Oczywiście można argumentować, że tworzenie katalogu nadrzędnego powinno być domyślnym i można użyć opcji sprawdzania, aby zapobiec tworzeniu katalogu, jeśli rodzic nie istnieje.
Ale powodem, dla którego jest odwrotnie, jest po prostu historia. Podstawowa wersja mkdir nie tworzyła katalogów nadrzędnych. Dlatego do dystrybucji X11 dołączono polecenie o nazwie mkdirhier, które było w stanie wykonać to zadanie: sprawdź, czy istnieją katalogi nadrzędne i utwórz je, jeśli to konieczne.
Później ta funkcjonalność została dodana do polecenia mkdir w wielu wersjach UNIX (nie wiem, czy obecnie jest w standardzie POSIX). Aby zachować zgodność ta funkcja została udostępniona przez włączanie flagą opcji:
-p
.Dlaczego źle jest mieć domyślnie włączone? Skrypty mogą polegać na awarii mkdir, jeśli katalog macierzysty nie istnieje. Szczególnie jako root użytkownika tworzenie drzew katalogów może być niebezpieczne.
Przykład:
W tym przykładzie katalog zostałby utworzony, a tworzenie kopii zapasowej nawet wtedy, gdy system plików
/backup
nie jest podłączony, a element nadrzędny/backup/$(uname -n)
nie istnieje, jeśli domyślnie byłby odwrotnie.Ogólna zasada: dobrą praktyką jest nie zmieniać domyślnego zachowania jakiegokolwiek narzędzia. W razie potrzeby podaj opcje umożliwiające zmianę domyślnego zachowania.
źródło
Myślę, że to trochę filozofia. Polecenie bare mkdir (1) (bez opcji) reprezentuje wywołanie systemowe mkdir (2) , zapewniając jego funkcjonalność w powłoce, nie robiąc nic więcej.
źródło
Na początku było tylko gołe
mkdir
polecenie. Zgodnie z zasadami projektowania Unixa to proste polecenie wykonało jedno proste zadanie: utworzenie katalogu.Później
mkdir
uzyskano-p
opcję obsługi typowego przypadku użycia, w którym osoba dzwoniąca chce utworzyć zero, jeden lub więcej katalogów, aby zapewnić istnienie określonej ścieżki. Z kilku powodów nie stało się to operacją domyślną. Po pierwsze, nie wszystkie systemy miały tę bardziej złożoną funkcję, a wymaganie tej-p
opcji oznaczało, że skrypty, które go używały, otrzymywały rozsądny komunikat o błędzie (coś podobnegomkdir: invalid option -z
), a nie dziwnie niekiedy tworzyły katalogi. Po drugie, a co najważniejsze, zachowaniemkdir -p
nie jest kompatybilnym zamiennikiemmkdir
we wszystkich przypadkach.W szczególności, w przypadku większości fileystems,
mkdir
to operacja atomowa . Jeśli program uruchomi się,mkdir playground
a polecenie powiedzie się, program wie, że utworzyłplayground
katalog. Pozwala to programowi traktować nowy katalog jako jego wyłączny plac zabaw: jeśli równocześnie uruchomi się inna instancja tego samego programu, jego wywołanie domkdir playground
nie powiedzie się. Ta właściwość nie jest oczywiście zapewniona,mkdir -p
ponieważ pozwala na istnienie argumentu.Gdyby
mkdir -p
istniał od samego początku, mógłby stać się trybem domyślnym, podobnie jakmkdir -a
polecenie tworzenia pojedynczego katalogu. Ale to nie byłoby zgodne ze zwykłą filozofią projektowania Uniksa: większość podstawowych narzędzi to proste owijanie wokół podstawowych operacji podstawowych, a bardziej wyszukane zachowania (takie jak tworzenie wielu katalogów za jednym razem) wymagają wymyślnych opcji.źródło
Dla mnie problemem jest to, że zachowanie opcji -p, gdyby była ona domyślna, jest zasadniczo efektem ubocznym. Dodaje złożoności polecenia, wykonując coś więcej niż to, o co go prosiłeś. Jest jeszcze jedna niewidzialna rzecz do zapamiętania. Jedną z podstawowych zasad prawidłowego programowania jest unikanie efektów ubocznych.
Współczesne języki programowania są tak potężne, że stosunkowo łatwo można zbudować dowolne złożone polecenie z prymitywów udostępnianych przez język. Wiąże się to z podjęciem świadomej decyzji o wymaganym zachowaniu, a także pozostawia konkretny, widoczny zapis tego, co zostało zrobione.
źródło