Cara mencetak baris baru dalam output baris arahan

Anehnya, mendapatkan komputer untuk memberikan output yang dapat dibaca kepada manusia bukanlah suatu pencapaian yang mudah. Dengan pengenalan aliran standard dan output standard khas, program memperoleh cara untuk saling berbicara menggunakan aliran teks biasa. Tetapi memanusiakan dan memaparkan stdout adalah perkara lain. Teknologi sepanjang zaman pengkomputeran telah berusaha menyelesaikan masalah ini, dari penggunaan watak ASCII dalam paparan komputer video hingga perintah shell moden seperti echodan printf.

Kemajuan ini tidak lancar. Tugas mencetak output ke terminal penuh dengan kebiasaan untuk dinavigasi oleh pengaturcara, seperti yang dicontohkan oleh tugas tidak biasa yang menipu untuk mengembangkan urutan pelarian untuk mencetak baris baru. Pengembangan placeholder \ndapat dicapai dengan banyak cara, masing-masing dengan sejarah dan komplikasi yang tersendiri.

Menggunakan echo

Dari kemunculannya di Multics hingga ke mana-mana sistem Unix yang moden, echotetap menjadi alat yang tidak asing lagi untuk membuat terminal anda mengatakan "Hello world!" Sayangnya, pelaksanaan yang tidak konsisten di seluruh sistem operasi menjadikan penggunaannya sukar. Di mana echopada beberapa sistem secara automatik akan memperluas urutan pelarian, yang lain memerlukan -epilihan untuk melakukan perkara yang sama:

echo "the study of European nerves is \neurology" # the study of European nerves is \neurology echo -e "the study of European nerves is \neurology" # the study of European nerves is # eurology

Kerana ketidakkonsistenan dalam pelaksanaan ini, echodianggap tidak mudah alih. Selain itu, penggunaannya bersama dengan input pengguna agak mudah rosak melalui serangan suntikan shell menggunakan pengganti arahan.

Dalam sistem moden, sistem ini hanya disimpan untuk memberikan keserasian dengan banyak program yang masih menggunakannya. Spesifikasi POSIX mengesyorkan penggunaan printfdalam program baru.

Menggunakan printf

Sejak Edisi Ke-4 Unix, printfperintah mudah alih pada dasarnya adalah yang baru dan lebih baik echo. Ini membolehkan anda menggunakan penentu format untuk memanusiakan input. Untuk mentafsirkan urutan pelarian garis miring terbalik, gunakan %b. Urutan watak \nmemastikan output diakhiri dengan barisan baru:

printf "%b\n" "Many females in Oble are \noblewomen" # Many females in Oble are # oblewomen

Walaupun printfmempunyai pilihan lebih jauh yang menjadikannya pengganti yang jauh lebih kuat echo, utiliti ini tidak mudah dibaca dan dapat rentan terhadap serangan string format yang tidak terkawal. Penting bagi pengaturcara untuk memastikan mereka menangani input pengguna dengan teliti.

Meletakkan barisan baru dalam pemboleh ubah

Dalam usaha untuk meningkatkan daya bawa di antara penyusun, Piawaian ANSI C ditubuhkan pada tahun 1983. Dengan menggunakan kutipan ANSI-C $'...', urutan pelarian diganti dalam output mengikut piawaian.

Ini membolehkan kita menyimpan rentetan dengan baris baru dalam pemboleh ubah yang dicetak dengan baris baru yang ditafsirkan. Anda boleh melakukannya dengan menetapkan pemboleh ubah, kemudian memanggilnya dengan printfmenggunakan $:

puns=$'\number\narrow\nether\nice' printf "%b\n" "These words started with n but don't make $puns" # These words started with n but don't make # umber # arrow # ether # ice

Pemboleh ubah yang diperluas adalah satu kutipan, yang diteruskan secara harfiah ke printf. Seperti biasa, penting untuk mengendalikan input dengan betul.

Pusingan bonus: pengembangan parameter shell

Dalam artikel saya yang menjelaskan Bash dan pendakap, saya membahas keajaiban pengembangan parameter shell. Kita juga dapat menggunakan satu pengembangan ${[email protected]}, untuk menafsirkan urutan pelarian. Kami menggunakan printf's %sspecifier untuk mencetak sebagai rentetan, dan Eoperator betul akan mengembangkan urutan melarikan diri dalam pembolehubah kami:

printf "%s\n" ${[email protected]} # umber # arrow # ether # ice

Cabaran berterusan untuk bercakap dalam diri manusia

Interpolasi rentetan terus menjadi masalah kenyal bagi pengaturcara. Selain mendapatkan bahasa dan cengkerang untuk menyetujui apa yang dimaksudkan dengan tempat letak tertentu, menggunakan urutan pelarian yang betul memerlukan perhatian untuk perincian.

Interpolasi rentetan yang lemah dapat menyebabkan output yang kelihatan konyol, serta memperkenalkan kerentanan keselamatan, seperti dari serangan suntikan. Sehingga evolusi terminal seterusnya meminta kita bercakap dalam emoji, sebaiknya kita memberi perhatian ketika mencetak output untuk manusia.