Jak wydrukować „-n” bez wydawania nowego wiersza?


16

Próbuję drukować -nza pomocą echopolecenia. Ale jeśli po prostu piszę echo -n, wydaje tylko nowy wiersz, nie pokazuje się -n, zamiast tego wydaje nowy wiersz.


Czy echo -n -- -ndziała (nie masz pod ręką żadnego linuksa do przetestowania)?
n0rd

Instaluję Ubuntu na maszynie wirtualnej i wydaje się, że działa bardzo wolno, czekaj.
Star OS

1
Sprawdziłem - nie ma. Prawdopodobnie dlatego, że jest to wewnętrzna komenda bash i nie używa getopt(???) do analizowania wiersza poleceń
n0rd

1
To pytanie jest zadawane i udzielane w pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - „ Zgodne aplikacje, które ... mogą oczekiwać echa -n, powinny użyć narzędzia printf pochodzącego z dziewiątej System edycji ”
Brandin

Pierwsze popularne pytanie, które zadałem. Tak?
Star OS

Odpowiedzi:


28

Problem polega na tym, że echointerpretuje to -njako argument. W domyślnej implementacji bash oznacza to (od help echo):

  -n  do not append a newline

Istnieją różne sposoby obejścia tego:

  1. Zmień go w coś, co nie jest opcją, dołączając inną postać. Na przykład powiedz, echoaby nie drukować nowego wiersza -n, a następnie powiedz mu, aby zinterpretował znaki ukośnika odwrotnego -ei wyraźne dodanie nowego wiersza.

    $ echo -ne '-n\n'
    -n
  2. Alternatywnie, po prostu wstaw spację

    $ echo " -n"
     -n

    To jednak dodaje przestrzeń, której prawdopodobnie nie chcesz.

  3. Użyj przed nim znaku niedrukowalnego. Tutaj. Używam backspace ( \b)

    $ echo -e "\b-n"
    -n

    Dodaje to także dodatkową postać, której prawdopodobnie nie chcesz.

  4. Użyj podstępu

    $ echo n- | rev
    -n

    revPolecenie po prostu drukuje jego wyjście odwrócone.

  5. Użyj odpowiedniego narzędzia do pracy

    $ printf -- '-n\n'
    -n

Masz rację, że zrobi to dowolny prawidłowy znak.
Pilot6

@ Pilot6 tak, ale problem z tym podejściem (twoim i moim) polega na tym, że dodaje on dodatkowego charakteru. Może to powodować problemy. Zwłaszcza jeśli chcesz to przeanalizować i spróbować czegoś takiego grep '^-n'. pritnfto naprawdę droga.
terdon

Cóż, i printftak jest lepiej, ale pytanie dotyczy sprawiedliwego echo.
Pilot6

2
Wygląda na to, że echo -e "-n\c"robi dokładnie to samo.
Pilot6

1
\ctłumi dalszą produkcję
Pilot6


7

Możesz użyć tego polecenia, ale dodaje ono dodatkowe miejsce.

echo -e  "\r-n"

To jest rodzaj włamania.

-e włącza symbole poleceń z odwrotnym ukośnikiem.

\r jest zwrot karetki.

Właściwie każdy \prawidłowy znak zrobi w dowolnym miejscu ciągu.

Możesz sprawdzić, które są ważne przez help echo.

echo "-n"nie działa, ponieważ -njest wykorzystywany jako parametr echo.

PS Najlepszym rozwiązaniem jest IMHO

echo -e "-n\c"

Nie dodaje się żadnych dodatkowych znaków .

echo -e "-n\n"

wypisuje to samo, ale z nowym znakiem linii.


1
Wow! To jest lepsze niż moje; czy możesz wyjaśnić trochę „początkującym” ;-)
Sadi

Dzięki, zauważyłem również, że nie ma znaczenia, gdzie dodajesz znak powrotu karetki, na początku lub na końcu.
Sadi

@Sadi tak, ponieważ dodawanie czegokolwiek powoduje, że jest to niepoprawna opcja. -njest ważny, -nfoonie jest tak, że zostanie wydrukowany.
terdon

@terdon man echoteż to ma. Ale helpjest trochę lepiej.
Pilot6

Wiem, że to ma, to po prostu nie ma znaczenia. /bin/echojest zupełnie inną rzeczą i kiedy uruchamiasz echobash, dostajesz wbudowaną funkcję, która może być zupełnie inna w zależności od twojej powłoki.
terdon

5

Myślę, że jeśli zdecydowanie chcesz używać echotylko, powinno cię to zadowolić:

echo "-n "

Działa to, ponieważ while -njest prawidłową opcją dla echo, -na spacja po nim nie jest. Ponieważ nie jest to opcja, echowystarczy ją wydrukować.


Większość widzów może chcieć tylko „-n”, a nie „-n”.
Star OS

5

Naprawdę się nad tym zastanowiliście.

 echo -e \\055n

Lub bez końca nowej linii

 echo -en \\055n

Jak to printf "-n\n" jest przesadzanie?
Dmitrij Grigoriew

Tak, właśnie odpowiedziałem w ten sposób. Usunie moją odpowiedź. Jest to stosunkowo przenośne, ponieważ działa z wbudowanym echem i /bin/echoprzynajmniej jeśli jest wywoływane jakoecho -e "\055n"
dniu

-en nie jest tym, czego chcę.
Star OS

2

Aby rozszerzyć odpowiedź @ AB, jedynym przenośnym sposobem na użycie echojest powstrzymanie się od korzystania z takich opcji jak -n. printfZamiast tego rozważ użycie, jeśli jest dostępne. Ta strona zawiera szczegółowe informacje i bardzo dobrze wyjaśnia, kiedy, jak echoi jakprintf należy z niej korzystać:

Obecnie echo (1) jest przenośne tylko wtedy, gdy pominiesz flagi i sekwencje specjalne. Zamiast tego użyj printf (1), jeśli potrzebujesz więcej niż zwykłego tekstu.


Mam zamiar udzielić odpowiedzi, edytuj odpowiedź.
Star OS

Nie jestem pewien, czy dobrym pomysłem jest zmiana odpowiedzi innej osoby, tak aby zawierała więcej tekstu ode mnie niż od oryginalnego autora.
Dmitrij Grigoryev,

2

W skrypcie Bash możesz uruchomić:

echo -n -
echo n

Lub w powłoce interakcyjnej:

echo -n - ; echo n

To echojest -postać i npostać.


Próbowałeś? To jest złe.
Pilot6


Wyjścia pierwszego polecenia -pilot6@Pilot6:~$. Drugie wyjścia n.
Pilot6

@ Pilot6 Zależy od tego, czy używasz go w interaktywnym terminalu, czy w skrypcie bash, który nie jest określony w pytaniu. OTOH, jeśli potrzebujesz go w terminalu, po prostu połącz te dwie linie &&- nie powiedziałbym, że ta odpowiedź jest zła .
user12205,

Zedytuję to, aby stało się o wiele bardziej zrozumiałe dla skryptu bash.
Star OS

1

Trzy inne sposoby:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

Możesz biegać

printf -n;echo

Testowane w Busybox Ash


Popiół? Popiół? POKEMON mam na myśli, co?
Star OS

Uruchomiłem „busybox ash”
jiwopene

Powiedz „Busybox” lub „Busybox Ash”. Nie tylko „Ash”, ponieważ ludzie mogą myśleć o tej postaci pokemon lub ******* popiołu z wulkanów.
Star OS

Lepszy. alt255alt255
Star OS

@StarOS ashto nazwa powłoki Almquist.
muru,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.