Powłoki mają wyspecjalizowane funkcje do pracy z plikami i przenoszenia danych z jednego programu do drugiego (przy założeniu, że dane są tekstem). Do tych zadań skrypty powłoki mogą być mniej kłopotliwe niż język skryptowy, taki jak Python.
Zaletą skryptu powłoki jest to, że używane polecenia są w zasadzie tymi samymi poleceniami, których używasz z wiersza poleceń - więc jeśli możesz coś zrobić w powłoce, jesteś w połowie drogi do skryptu tej samej operacji.
Oto na przykład skrypt bash, który przenosi wszystkie pliki PNG z bieżącego katalogu do określonego katalogu.
#!/usr/bin/sh
mv *.png $1
Oto wersja Python.
#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
shutil.move(filename, sys.argv[1])
Zauważysz:
- Skrypt bash jest trzeci tak długo, jak Python, jeśli policzysz linie (z wyłączeniem linii shebang) - jeszcze mniej według liczby znaków
- Skrypt Pythona wymaga zaimportowania trzech bibliotek, a wszystko, czego potrzebujesz do tego zadania, jest natywnie dostępne w bash
- Skrypt Pythona wymaga jawnej pętli do przenoszenia plików, podczas gdy jest to część semantyki
mv
polecenia w bash
- Skrypt bash może działać szybciej - prawdopodobnie wywołasz go z bash i możesz go użyć
source
w tym samym wystąpieniu powłoki
glob.iglob("./*.png")
to całkiem kęs *.png
Jeśli chciałbyś napisać podstawową operację na potoku w Pythonie, byłbyś zaskoczony gadatliwością. (Oczywiście niektóre rzeczy, takie jak przesyłanie strumieniowe grep
, można zastąpić kodem w języku Python zamiast używać zewnętrznego programu, więc często nie trzeba tak dużo przesyłać strumieniowo.)
Jako kontrprzykład musiałem kiedyś napisać procedurę sprawdzającą, jak długo każda z nazw plików znajduje się w określonym katalogu. Jeśli były dłuższe niż obsługiwane przez określony system operacyjny, musiały zostać skrócone. Może to spowodować zduplikowanie nazw plików, które musiałem skorygować, a ponieważ byłyby linkowane ze strony internetowej, skrócone nazwy musiały być stabilne, tj. Powinny być generowane w taki sposób, aby ta sama długa nazwa pliku zawsze skutkowała ta sama skrócona nazwa pliku. Zrobiłem to, generując szesnastkową md5 długiej nazwy pliku i dodając pierwsze cztery znaki do skróconej nazwy (nazwy nadal mogą się kolidować, ale było to bardzo niejednoznaczne, więc po prostu sprawdziłem ten warunek i zapłaciłem kaucję, jeśli tak się stanie) .
Zrobiłem to w bash, ponieważ był on częścią naszego systemu kompilacji, który był już napisany w bash. Dokładnie tak trudno było sobie wyobrazić. Pisanie w Pythonie zajęłoby o wiele mniej czasu i zapewne też byłoby jaśniejsze.
W skrócie: różne języki są zaprojektowane do różnych rodzajów zadań; wybierz dostępny język, który najlepiej odpowiada wykonywanemu zadaniu.