Podręcznik GNU Coreutilsmv
mówi:
-f --force Do not prompt the user before removing a destination file.
Jednak wydaje się to już zachowanie domyślne mv
, więc -f
opcja wydaje się zbędna. Np. W GNU Bash w wersji 4.3.11:
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Wydaje się mało prawdopodobne, że intencją -f
flagi jest przesłonięcie alias mv="mv -i"
, ponieważ istnieje kilka standardowych sposobów przesłonięcia aliasu (np. Użycie \mv
), które zrobiłyby to bardziej zwięźle i w sposób spójny między poleceniami.
Podręcznik zauważa, że „Jeśli określisz więcej niż jedną z opcji -i, -f, -n, tylko ostatnia zostanie zastosowana”, ale nadal wydaje się mało prawdopodobne, że intencją -f
flagi jest zastąpienie -i
flagi w ogóle, ponieważ ekwiwalentne zachowanie można osiągnąć po prostu używając mv
, co jest o wiele bardziej zwięzłe i zrozumiałe niż używanie mv -if
.
W takim razie jaki jest cel -f
flagi? Dlaczego to istnieje?
mount
(chociaż istnieją lepsze przykłady). Czy naprawdę chcesz pamiętać o domyślnych ustawieniach każdej opcji, aby określić, które opcje należy ustawić? DOBRA RZECZ jest mieć opcje zarówno domyślne, jak i domyślne, więc możesz jawnie ustawić tę opcję, zamiast mentalnie śledzić domyślną wartość. Coś tam jest łatwiejsze do zapamiętania niż coś nieistniejącego .Odpowiedzi:
Użycie tego
-f
jest dokładniej opisane na stronie podręcznika użytkownika z 4BSD, tam gdzie dodano opcje-f
i-i
:Jeszcze bardziej precyzyjna definicja działania mv podana jest w standardzie POSIX , co dodaje, że
-f
zastępuje tylko,-i
jeśli pojawi się później w wierszu poleceń.Więc domyślne zachowanie jest nieco inne niż
-f
. Domyślnie prosi się o potwierdzenie tylko wtedy, gdy cel nie jest zapisywalny. (To zachowanie sięga co najmniej do V4 , gdziemv
nie wybrano żadnych opcji.) Jeśli-i
podana jest opcja, mv będzie dodatkowo prosić o potwierdzenie, ilekroć istnieje cel.-f
Opcja będzie hamować prosząc w obu tych przypadkach (jeśli występuje po każdym-i
).źródło
-f
flaga była używana, nawet jeśli nie była używana .isatty(0)
). Ponadto, chociaż prawdą jest, że późniejsze-f
przesłania-i
, nie może to oznaczać, że jest to to samo, co brak podanych argumentów.Jest to przydatne, gdy ustawiłeś wykonanie
mv
na rozsądną wartość domyślną:Gdy chcesz wymusić ruch, zadziała to:
Ponieważ liczy się ostatnia opcja w rozwiniętym poleceniu:
Ten punkt jest również wspomniany w podręczniku GNU Coreutils .
źródło
alias mv="mv -i"
jest przyczyną istnienia-f
.mv(1)
co-i
, wierzę, że każdy, kto używał linii poleceń od ponad kilku lat, został spalonymv
, w pewnym momencie.Istnieje, ponieważ (
man mv
)Możesz więc mieć skrypt / alias / funkcję, która zawsze pyta, ale nadal możesz zastąpić tę opcję.
Znacząca funkcja / skrypt zrobiłby oczywiście coś więcej (np. Zarejestrował akcję).
źródło
alias mv="mv -i"
powód istnienia-f
. Wspominasz także skrypty i funkcje. Czy możesz podać przykłady, używając tych dwóch?mv -f
, więc wciąż nie jest dla mnie jasne, jak uzasadniają / wyjaśniają jego istnienie. Przepraszam, jeśli brakuje mi oczywistości!mv -i
. Jeśli chcesz z nich korzystać, ale pomijasz interakcję, możesz użyćMV -f
itd.mv
bez żadnej z tych opcji polega czasem na pytaniu (cel nie jest zapisywalny i interaktywny terminal), więc byłaby to wyraźna różnica międzymv -f
i\mv
.Samo
mv
polecenie może działać inaczej z-f
opcją, ponieważ spróbuje zastąpić zapisywanie chronionych plików bez pytania.Z powodu uprawnień do zapisu w katalogu użytkownik2 może nadpisywać pliki użytkownika1
./dir/
, ale zostanie o tym ostrzeżony.-f
zapobiega ostrzeżeniu.źródło
W programowaniu powłoki używanie -f jest powszechnym idiomem używanym do upewnienia się, że twoje polecenia nie przerywają błędów lub nie pytają skryptu / użytkownika o interaktywną odpowiedź podczas uruchamiania niektórych poleceń. Ostatnią rzeczą, jakiej chcesz, to aby skrypt wstrzymał oczekiwanie na dane wejściowe od użytkownika lub, co gorsza, na niewłaściwe polecenie pobierające dane wejściowe ze standardu.
Uwaga: cofnięcie aliasu może powodować / usuwać skutki uboczne. W przypadku aliasu polecenia do innej wersji lub z dodatkowymi opcjami cofnięcie aliasu spowoduje niepożądane skutki uboczne. Na przykład, możesz mieć skonfigurowany alias z mv i rm, aby używać kosza (lub innych systemów ochrony / śledzenia). Cofnięcie aliasu spowoduje uszkodzenie tego ...
źródło
-f
Opcja cp lub mv nie gwarantuje, że „będą działać”. Na przykład, jeśli uprawnienie jest niewystarczające, polecenie -f nie sprawi, że będzie działać. Miałeś na myśli to, że -f wymusza nadpisanie bez pytania. Przeciwna flaga -i oznacza, że wymaga interaktywnego nadpisywania.isatty(0)
), więc np. Jeśli twój skrypt działa jako część potoku, nie zostanie uruchomiony. 2.) Dodawanie-f
nie jest tym samym co cofanie,-i
ponieważmv -i -f
różni się odmv
, patrz odpowiedź Marka .