2012-06-25 10 views
311

mam problem z echo w moim skryptu:'Echo' bez znaku nowej linii w skrypcie powłoki

echo -n "Some string..." 

wydruki

-n Some string... 

i przechodzi do następnego wiersza. W konsoli to działa correcly bez nowej linii:

Some string... 
+2

Którą implementację powłoki bourne używasz? Jeśli uruchomię 'bash' w trybie powłoki bourne, działa tutaj dobrze. Poza tym jest mało prawdopodobne, że używasz powłoki firmy Bourne jako powłoki interaktywnej, prawda? – FatalError

+3

na Ubuntu: tekst "echo -ne" bez nowej linii: "; echo "some text"; ' – zsoltii

Odpowiedz

334

Istnieją różne wersje komendy echo, z różnych zachowań. Najwyraźniej powłoka używana w twoim skrypcie używa wersji, która nie rozpoznaje -n.

Polecenie printf ma znacznie bardziej spójne zachowanie. echo jest w porządku dla prostych rzeczy, takich jak echo hello, ale sugeruję użycie printf dla czegoś bardziej skomplikowanego.

Jakiego systemu używasz i jakiej powłoki używa twój skrypt?

+34

Rozpoczynając od linii' #!/bin/bash' zadziałało. Normalnie pracuję z bash. – qwertz

+0

Żałuję, że nie ma odpowiednika Windows w CMD :(O ile widzę, nie ma, tylko obejścia, aby osiągnąć to samo zachowanie –

+2

@kayleeFrye_onDeck: Być może istnieje wersja systemu Windows 'printf' polecenia. –

51

Spróbuj z

echo -e "Some string...\c" 

To działa na mnie jak oczekiwano (jak zrozumiałem z twojego pytania).

Zauważ, że dostałem tę informację ze strony man. Strona man również zauważa, że ​​powłoka może mieć własną wersję echo i nie jestem pewien, czy bash ma swoją własną wersję.

+0

+1 za wskazanie mnie we właściwym kierunku, chociaż echo, które nie rozpoznaje -na opcja prawdopodobnie nie rozpoznaje opcji -e (ani nie potrzebuje), więc prawdopodobnie chcesz po prostu wymówić "echo" jakiś ciąg ... \ c "zamiast tego. Jeśli jednak potrzebujesz obsługi wielu wariantów bash za pomocą bardzo różniących się poleceń echa, prawdopodobnie lepiej jest użyć printf lub musisz sprawdzić możliwości komend echo z czymś takim jak '[-n" $ (echo -e) "] && echo" sh stuff \ c "|| echo -e "bash stuff \ c" '(przynajmniej bash obsługuje \ c również, więc nie trzeba używać opcji -n, ale potrzebujesz -e dla bash) – Timo

+0

\ c dzięki .. pracował –

78

bash ma „wbudowany” polecenie o nazwie „echo”:

$ type echo 
echo is a shell builtin 

Dodatkowo istnieje „echo” Polecenie to jest właściwy plik wykonywalny (czyli widełki powłoki i execs /bin/echo, w przeciwieństwie do interpretacji i wykonywania go echo)

$ ls -l /bin/echo 
-rwxr-xr-x 1 root root 22856 Jul 21 2011 /bin/echo 

zachowanie obu WRT echo „s \c i -n różna. Najprościej jest użyć printf, która jest dostępna na czterech różnych * nix smakach, że spojrzałem na:

$ printf "a line without trailing linefeed" 
$ printf "a line with trailing linefeed\n" 
+2

Dzięki za masowo do głębi odpowiedz! – Fuser97381

0

Jeśli używasz echo wewnątrz czy z innych komend, jak „czytać”, to może ignorować ustawienie i tak przeskoczy do nowej linii.