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.