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.

Star OS
źródło
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
terdon
źródło
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.

Pilot 6
źródło
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ć.

Sadi
źródło
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
Jozuego
źródło
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.

Dmitrij Grigoriew
źródło
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ć.

jiwopene
źródło
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
kos
źródło
0

Możesz biegać

printf -n;echo

Testowane w Busybox Ash

jiwopene
źródło
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,