kabuk betiğinde yeni satır olmadan 'echo'


540

Senaryomda bir sorunum var echo:

echo -n "Some string..."

baskılar

-n Some string...

ve bir sonraki satıra geçiyor. Konsolda yeni satır olmadan doğru çalışıyor:

Some string...

2
Hangi bourne kabuğu uygulamasını kullanıyorsunuz? Eğer bashbourne kabuk modunda koşarsam, burada iyi çalışır. Ayrıca, interaktif kabuğunuz olarak gerçekten bir bourne kabuğu kullanmanız pek olası değil, değil mi?
FatalError

4
Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii

Bunun çok eski olduğunu biliyorum, ama bu benim için yeni bir satır olmadan bir dönem eklemek için çalışıyor: echo | set / p = "."
SPlatten

Yanıtlar:


572

echoKomutun farklı davranışlara sahip birden çok sürümü vardır . Görünüşe göre betiğiniz için kullanılan kabuk tanımayan bir sürümü kullanıyor -n.

printfKomut çok daha tutarlı bir davranış vardır. echogibi basit şeyler için iyidir echo hello, ancak printfdaha karmaşık bir şey için kullanmanızı öneririm .

Hangi sistemdesiniz ve betiğiniz hangi kabuğu kullanıyor?


46
Çizgi ile başlayarak #!/bin/bashçalıştı. Normalde bash ile çalışıyorum.
qwertz

Ben kadarıyla gördüğünüz gibi CMD :( As Windows eşdeğer olsaydı, yok, sadece aynı davranışı elde etmek geçici çözümler.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: Belki de printfkomutun Windows sürümü vardır .
Keith Thompson

Keşke. echoher zaman yeni satırlar ekler ... Geçici çözüm en iyi ihtimalle cenky.
kayleeFrye_onDeck

2
@alper Bu %sizin kabuk isteminizdir. Bunu deneyin ve dikkatlice izleyin:printf hello; sleep 5
Keith Thompson

150

bash "echo" adında "yerleşik" bir komutu vardır:

$ type echo
echo is a shell builtin

Ek olarak, uygun bir çalıştırılabilir olan bir "echo" komutu vardır (yani, /bin/echoyorumlama echove yürütmenin aksine kabuk çatalları ve yürütmeler ):

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

echo'In WRT'sinin davranışı \cve -ndeğişkenliği değişir. En iyi bahsiniz, printfbaktığım dört farklı * NIX aromasında mevcut:

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

3
Çok derin cevaplar için teşekkürler!
Darth Egregious

91

İle deneyin

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

Benim için beklendiği gibi çalışıyor (sorunuzdan anladığım gibi).

Bu bilgiyi mansayfadan aldığımı unutmayın . manSayfa aynı zamanda kabuk kendi sürümüne sahip olabilir notları echove eğer emin değilim bashkendi sürümü de vardır.


Beni doğru yöne ima etmek için +1, ancak -ne seçeneğini tanımayan yankı muhtemelen -e (veya gerek) seçeneğini tanımaz, bu yüzden muhtemelen echo "some string...\c"bunun yerine söylemek istersiniz . Bununla birlikte, çılgınca farklı yankı komutları ile birden fazla bash varyantını desteklemeniz gerekiyorsa, muhtemelen printf kullanmaktan daha iyidir veya echo komutlarının yeteneklerini [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(en azından bash \ n \ c) de bir şeyle kontrol etmeniz gerekir , bu nedenle -n seçeneği, ama bash için -e'ye ihtiyacınız var)
Timo

Bana göre, bu OP'nin durumunda tam olarak ne yapar: çıkışlar -e. Sanırım printf gerçekten daha tutarlı
aexl

-e bir posix kabuk betiğinde çalışmaz, bunun yerine ekrana gönderilir.
Thomas Dignan

7

Bunu başarmak için temel olarak sık kullandığım iki yöntem vardır:

1. ile imleç çıkış karakterini ( \c) kullanmaecho -e

Örnek :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eflag , dizede E scape karakterlerini etkinleştirir .
  • \cC imlecini geçerli satıra geri getirir .

VEYA

2.printf Komutunu kullanma

Örnek :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

Bir if içinde "read" gibi diğer komutlarla yankı kullanırsanız, bu ayar dikkate alınmayabilir ve yine de yeni bir satıra atlayacaktır.


2

Sadece en popüler linux Ubuntu için bash:

  1. Hangi kabuğu kullandığınızı kontrol edin? Çoğunlukla işlerin altında, başka görün :

    echo $0

  2. Yukarıdaki baskılar varsa bash, aşağıda çalışacaktır:

    printf "hello with no new line printed at end"
    VEYA
    echo -n "hello with no new line printed at end"


1

Ben şu anda çıktı baskı aşağıdaki gibi inanıyorum

~ echo -e "String1\nString2"
String1
String2

xargsÇok satırlı stdout'u aynı satıra almak için kullanabilirsiniz .

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

Gittiğinizde kabuk komut dosyası yazdığınızda her zaman ilk satırı #! / Usr / bin / env bash olarak koyun. Bu kabuk, kaçış dizilerini atlamaz veya manipüle etmez. ex echo "Bu ilk \ n satırı" yazdırır Bu ilk \ n satırıdır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.