Często interakcyjnie przechodzę przez pętlę np. moje pliki i chcę wykonać konkretną operację na nich wszystkich, załóżmy, że chciałbym zmienić nazwę wszystkich plików:Pokaż polecenia bez ich wykonywania
for file in $(ls); do mv "$file" "${file}_new"; done
To działa dobrze. Ale przed wywołaniem tego polecenia, chciałbym zobaczyć, co faktycznie robi, więc chciałbym dodać echo przed
for file in $(ls); do echo mv "$file" "${file}_new"; done
to wtedy pokazuje mi wszystkie polecenia by ją wywołać. Jeśli jestem z nich zadowolony, usuwam echo
i uruchamiam go.
Jednak, gdy polecenia są nieco bardziej subtelne, może obejmować rury lub więcej niż jedno polecenie, to już nie działa. Oczywiście mógłbym użyć '
, więc znaki specjalne nie zostaną zinterpretowane, ale wtedy nie mam rozszerzenia parametrów. Mógłbym także uciec od specjalnych postaci, ale stałoby się to bardzo nudne.
Moje pytanie brzmi, jaki jest najlepszy sposób na zrobienie tego? Przeczytałem w man bash
o opcji -n
, która wykonuje polecenie "Odczytaj komendy, ale ich nie wykonuj." Może to być użyte do sprawdzenia skryptu powłoki pod kątem błędów składni. Jest to ignorowane przez powłoki interaktywne. " Dokładnie tego potrzebuję, ale potrzebuję go do interaktywnej powłoki. Zauważ, że opcje -x
lubnie pomagają, ponieważ nie tylko pokażą komendę, ale także wywołają ją, a wtedy może być już za późno.
Technicznie rzecz biorąc, nie ma sposobu, aby to osiągnąć. – devnull
Alternatywnie możesz * alias-opróżnić * każde polecenie w coś takiego jak 'alias = 'bash -c" "'', aby parametry zostały zaakceptowane, ale nic nie zostanie wykonane. Możesz uruchomić pętlę * alias-emptifier *, wykonać żądany proces, a później * alias-restore * polecenia - przywracając ich funkcjonalność. –
Rubens
Nawiasem mówiąc, użycie 'for file in $ (ls)' poświęca dziecko (proces) bez ważnego powodu. Dlaczego nie użyć 'dla pliku w *'? – cdarke