Porównać
echo -n "bar"
z
echo "bar" -n
Pierwsza robi to , co moim zdaniem powinna robić (drukuje „pasek” bez nowej linii), a druga nie. Czy to błąd, czy z założenia? Dlaczego różni się od wielu programów CLI tym, że nie można przenosić opcji? Na przykład tail -f /var/log/messages
jest dokładnie taki sam jak tail /var/log/messages -f
. Czasami robię to drugie, kiedy zapominam, że chciałem tego pierwszego, ponieważ wewnętrznie opcje i argumenty są przestawiane, zwykle przez getopt .
Aktualizacja: tak, początkowo osłabiłem moje pytanie. Usunąłem osłabienie, które musisz przejrzeć historię, aby niektóre odpowiedzi miały sens.
command-line
ksenoterracid
źródło
źródło
echo -n "bar"
daje „echo "bar" -n
Odpowiedzi:
Jak zauważyło większość innych, „-n” jest interpretowane dosłownie, jeśli jest umieszczone gdziekolwiek, ale bezpośrednio po
echo
poleceniu.Dawniej wszystkie narzędzia UNIX były takie - szukały opcji dopiero bezpośrednio po nazwie polecenia. Prawdopodobnie BSD lub GNU były pionierami bardziej elastycznego stylu (choć mogę się mylić), ponieważ nawet teraz POSIX określa stary sposób jako poprawny (patrz Wytyczna 9, a także
man 3 getopt
w systemie Linux). W każdym razie, chociaż większość narzędzi Linuksa używa obecnie nowego stylu, istnieją pewne ograniczeniaecho
.Echo
to bałagan, pod względem standardów, ponieważ istniały co najmniej dwie zasadniczo sprzeczne wersje, zanim powstało POSIX. Z jednej strony masz styl SYSV, który interpretuje znaki z odwrotnym ukośnikiem, ale poza tym traktuje argumenty dosłownie, nie akceptując żadnych opcji. Z drugiej strony masz styl BSD, który traktuje inicjał-n
jako specjalny przypadek i generuje absolutnie wszystko inne dosłownie. A ponieważecho
jest to wygodne, masz tysiące skryptów powłoki, które zależą od jednego lub drugiego zachowania:Z powodu semantycznego „traktuj wszystko dosłownie” nie można nawet dodać nowej opcji
echo
bez zepsucia rzeczy. Gdyby GNU użył na nim schematu elastycznych opcji, piekło rozpętałoby się.Nawiasem mówiąc, dla najlepszej kompatybilności pomiędzy implementacjami powłoki Bourne'a, użyj
printf
raczej niżecho
.ZAKTUALIZOWANO, aby wyjaśnić, dlaczego
echo
w szczególności nie używa elastycznych opcji.źródło
POSIXLY_CORRECT
.echo
istnieją również implementacje, które rozpoznają-e
lub-E
jako opcje. Aby uzyskać przenośność, nie zaczynaj od-
ani nie używaj czegoś takiegoprintf %s -e
.Inne odpowiedzi prowadzą do tego, że możesz spojrzeć na stronę podręcznika man, aby zobaczyć, że -n staje się częścią ciągu, który należy echo. Chciałbym jednak zaznaczyć, że bez md5sum łatwo to zbadać i sprawia, że to, co się dzieje, jest nieco mniej tajemnicze.
źródło
Wow, wyjaśnienia wszystkich są długie.
To takie proste:
-n
jest opcją, jeśli pojawia się przed ciągiem, w przeciwnym razie jest to tylko kolejny ciąg do powtórzenia.Usuń
| md5sum
i zobaczysz, że wynik jest inny.źródło
Z prostej inspekcji nie jest to błąd z założenia ...
Wypróbuj to polecenie dla siebie:
Zauważysz, że powstaje md5
Właśnie pomieszałeś użycie -n w echu.
W twoim pierwszym przykładowym kodzie
-n jest używane do powiedzenia NIE umieszczaj nowej linii po tym echu.
Twoja druga próbka
traktuje -n jak dosłowny tekst.
źródło