Pertanyaan Bagaimana cara mencetak “-n” tanpa mengeluarkan baris baru?


Saya mencoba mencetak -n menggunakan echo perintah. Tetapi jika saya cukup mengetik echo -n, itu hanya masalah baris baru, tidak muncul -n, alih-alih mengeluarkan baris baru.


16
2017-11-23 17:46


asal


Apakah echo -n -- -n bekerja (tidak memiliki kotak linux apa pun yang berguna untuk menguji)? - n0rd
Saya menginstal Ubuntu di mesin virtual dan tampaknya sangat lambat, tunggu. - Star OS
Saya sudah memeriksanya - tidak. Mungkin karena itu perintah bash internal dan tidak digunakan getopt (???) untuk mem-parse command line - n0rd
Pertanyaan ini ditanyakan dan dijawab pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Menyesuaikan aplikasi yang ... mungkin bisa diharapkan untuk menggemakan -n, harus menggunakan utilitas printf yang berasal dari sistem Edisi Kesembilan" - Brandin
Pertanyaan populer pertama yang saya buat. Yay? - Star OS


Jawaban:


Masalahnya adalah echo menafsirkan -n sebagai sebuah argumen. Pada implementasi bash default, itu berarti (dari help echo):

  -n  do not append a newline

Ada berbagai cara untuk mengatasinya:

  1. Jadikan itu menjadi sesuatu yang bukan pilihan dengan memasukkan karakter lain. Misalnya, beri tahu echo untuk tidak mencetak baris baru dengan -n, lalu beri tahu untuk menginterpretasi backslash dengan -e dan tambahkan baris baru secara eksplisit.

    $ echo -ne '-n\n'
    -n
    
  2. Atau, cukup sertakan ruang

    $ echo " -n"
     -n
    

    Namun, itu menambahkan ruang yang mungkin tidak Anda inginkan.

  3. Gunakan karakter yang tidak dicetak sebelumnya. Sini. Saya menggunakan backspace (\b)

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

    Ini juga menambahkan karakter ekstra yang mungkin tidak Anda inginkan.

  4. Gunakan tipuan

    $ echo n- | rev
    -n
    

    Itu rev perintah hanya mencetak outputnya terbalik.

  5. Menggunakan alat yang tepat untuk pekerjaan itu

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

28
2017-11-23 18:06



Anda benar bahwa setiap karakter yang valid akan dilakukan. - Pilot6
@ Pilot6 ya tapi masalah dengan pendekatan itu (milik Anda dan saya) adalah bahwa ia menambahkan karakter ekstra. Itu bisa menyebabkan masalah di telepon. Terutama jika Anda kemudian ingin menguraikannya dan mencoba sesuatu seperti grep '^-n'. pritnf adalah cara untuk pergi, sungguh. - terdon♦
Baik, printf lebih baik pula, tapi pertanyaannya adalah tentang hanya echo. - Pilot6
Sepertinya echo -e "-n\c" melakukan hal yang tepat. - Pilot6
\c adalah menekan output lebih lanjut - Pilot6


Terkadang adalah ide yang bagus untuk menggunakan alat yang tepat. Anda bisa menggunakannya printf sebagai gantinya:

% printf "-n\n"       
-n

15
2017-11-23 17:50



Ini ide yang bagus, karena ada banyak varian echo, sementara printf lebih baik distandarisasi. - 200_success
Ini adalah ide yang disukai untuk portabilitas - Sergiy Kolodyazhnyy


Anda dapat menggunakan perintah ini, tetapi menambahkan ruang ekstra.

echo -e  "\r-n"

Ini semacam peretasan.

-e memungkinkan simbol perintah backslash.

\r adalah pengantar kereta.

Sebenarnya ada \ karakter yang valid akan dilakukan di setiap tempat string.

Anda dapat melihat mana yang valid oleh help echo.

echo "-n" tidak berfungsi karena -n digunakan sebagai parameter untuk echo.

P.S. Solusi terbaik IMHO adalah

echo -e "-n\c"

Itu tidak menambah karakter tambahan apa pun.

echo -e "-n\n"

mencetak yang sama tetapi dengan baris char baru.


7
2017-11-23 17:56



Wov! Ini lebih baik dari milikku; bisakah Anda menjelaskan sedikit untuk "pemula" ;-) - Sadi
Terima kasih, saya juga memperhatikan bahwa tidak masalah di mana Anda menambahkan carriage return, di awal atau akhir. - Sadi
@Sadi ya, itu karena menambahkan sesuatu membuatnya menjadi opsi yang tidak valid. -n adalah benar, -nfoo tidak demikian yang akan dicetak. - terdon♦
@terdon man echo memilikinya juga. Tapi help sedikit lebih baik. - Pilot6
Saya tahu itu ada, itu tidak relevan. /bin/echo adalah hal yang sama sekali berbeda dan ketika Anda berlari echo di bash, Anda mendapatkan builtin yang dapat sangat berbeda tergantung pada shell Anda. - terdon♦


Saya pikir jika Anda pasti ingin menggunakannya echo hanya, ini harus memuaskan Anda:

echo "-n "

Ini berfungsi karena sementara -n adalah opsi yang valid untuk echo, -n dengan spasi setelah itu tidak. Karena itu bukan pilihan, echo hanya mencetaknya.


5
2017-11-23 17:53



Sebagian besar pemirsa di sini mungkin hanya ingin "-n", bukan "-n". - Star OS


Kalian benar-benar terlalu memikirkannya.

 echo -e \\055n

Atau tanpa garis depan baru

 echo -en \\055n

5
2017-11-23 21:53



Bagaimana printf "-n\n"  sebuah overthinking? - Dmitry Grigoryev
Yup, saya baru saja menjawab seperti ini. Akan menghapus jawaban saya. Ini relatif portabel karena bekerja dengan built-in echo dan /bin/echo setidaknya jika dipanggil sebagai echo -e "\055n" - abligh
-tidak apa yang saya inginkan. - Star OS


Untuk memperpanjang jawaban @ A.B, satu-satunya cara portabel untuk digunakan echo adalah menahan diri dari menggunakan opsi seperti -n. Pertimbangkan digunakan printf sebagai gantinya jika tersedia. Halaman referensi ini memberikan lebih banyak detail dan menjelaskan dengan sangat baik kapan dan bagaimana echo dan printf seharusnya digunakan:

Saat ini, gema (1) hanya portabel jika Anda menghilangkan bendera dan keluar dari urutan.   Gunakan printf (1) sebagai gantinya, jika Anda membutuhkan lebih dari sekadar teks biasa.


2
2017-11-24 12:17



Saya sudah akan memperpanjang jawaban, silakan edit jawabannya. - Star OS
Saya tidak yakin itu ide yang baik untuk mengubah jawaban orang lain ke titik ketika itu akan memiliki lebih banyak teks dari saya daripada dari penulis asli. - Dmitry Grigoryev


Di skrip Bash Anda dapat menjalankan:

echo -n -
echo n

Atau dalam shell interasif:

echo -n - ; echo n

Ini echoes a - karakter dan sebuah n karakter.


2
2017-11-23 20:30



Apakah kamu sudah mencobanya? Ini salah. - Pilot6
@ Pilot6 Apakah kamu sudah mencobanya? ini tidak salah. - ace
Output perintah pertama -pilot6@Pilot6:~$. Output kedua n. - Pilot6
@ Pilot6 Tergantung apakah Anda menjalankannya di terminal interaktif atau dalam skrip bash, yang tidak ditentukan dalam pertanyaan. OTOH jika Anda membutuhkannya di terminal, cukup sederhana untuk menggabungkan kedua garis tersebut && - Saya tidak akan benar-benar mengatakan jawaban ini salah. - ace
Saya akan mengeditnya sehingga menjadi lebih jelas untuk skrip bash. - Star OS


Tiga cara lain:

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

1
2017-11-25 20:01





Anda bisa berlari

printf -n;echo

Diuji dalam Busybox Ash


0
2017-12-08 20:46



Abu? Abu? POKEMON maksudku, apa? - Star OS
Saya berlari 'busybox ash' - jiwopene
Ucapkan "Busybox" atau "Busybox Ash". Bukan hanya "Ash" karena orang mungkin berpikir tentang karakter pokemon atau abu ***** dari gunung berapi. - Star OS
Lebih baik. alt255alt255 - Star OS
@StarOS ash adalah nama Shell Almquist. - muru