Unix / Linux EOL adalah LF, linefeed, ASCII 10, escape sequence \n
.
Berikut cuplikan Python untuk mendapatkan persis satu penekanan tombol:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Ketika saya menekan Enterkeyboard saya untuk menanggapi potongan ini, itu memberi \r
, carriage return, ASCII 13.
Di Windows , Enterkirim CR LF == 13 10
. * nix bukan Windows; mengapa Entermemberi 13 bukan 10?
command-line
terminal
newlines
ascii
kucing
sumber
sumber
Jawaban:
Sementara jawaban Thomas Dickey cukup benar, Stéphane Chazelas dengan benar disebutkan dalam komentar atas jawaban Dickey bahwa pertobatannya tidak dilakukan dengan keras; itu adalah bagian dari garis disiplin.
Bahkan, terjemahannya sepenuhnya dapat diprogram.
Halaman manual man 3 termios pada dasarnya berisi semua informasi terkait. (Tautan ke proyek man-pages Linux , yang menyebutkan fitur mana yang hanya Linux, dan yang umum untuk POSIX atau sistem lain; selalu periksa bagian Menyesuaian untuk pada setiap halaman di sana.)
The
iflag
atribut terminal (old_settings[0]
dalam kode yang ditunjukkan di pertanyaan di Python ) memiliki tiga bendera yang relevan pada semua sistem POSIXy:INLCR
: Jika diatur, terjemahkan NL ke CR pada inputICRNL
: Jika diatur (danIGNCR
tidak diatur), terjemahkan CR ke NL pada inputIGNCR
: Abaikan CR pada inputDemikian pula, ada pengaturan keluaran terkait (
old_settings[1]
), juga:OPOST
: Aktifkan pemrosesan keluaran.OCRNL
: Peta CR ke NL pada output.ONLCR
: Peta NL ke CR pada output. (XSI; tidak tersedia di semua sistem POSIX atau Single-Unix-Specification.)ONOCR
: Lewati (jangan keluaran) CR di kolom pertama.ONLRET
: Lewati (jangan keluaran) CR.Misalnya, Anda dapat menghindari mengandalkan
tty
modul. Operasi "makeraw" hanya membersihkan satu set bendera (dan mengaturCS8
oflag):meskipun demi kompatibilitas, Anda mungkin ingin memeriksa apakah semua konstanta itu ada di modul termios terlebih dahulu (jika Anda menjalankan sistem non-POSIX). Anda juga dapat menggunakan
new_settings[6][termios.VMIN]
dannew_settings[6][termios.VTIME]
untuk mengatur apakah pembacaan akan memblokir jika tidak ada data yang tertunda, dan berapa lama (dalam bilangan bulat deciseconds). (BiasanyaVMIN
diatur ke 0, danVTIME
ke 0 jika bacaan harus segera kembali, atau ke angka positif (sepersepuluh detik) berapa lama bacaan paling banyak menunggu.)Seperti yang Anda lihat, di atas (dan "makeraw" secara umum) menonaktifkan semua terjemahan pada input, yang menjelaskan perilaku yang dilihat kucing:
Untuk mendapatkan perilaku normal, cukup hapus baris yang menghapus ketiga baris tersebut, dan terjemahan input tidak berubah bahkan ketika "mentah".
The
new_settings[1] = new_settings[1] & ~termios.OPOST
garis menonaktifkan semua proses output, terlepas apa bendera keluaran lain mengatakan. Anda bisa menghilangkannya agar proses pemrosesan output tetap utuh. Ini membuat output "normal" bahkan dalam mode mentah. (Itu tidak mempengaruhi apakah input secara otomatis digaungkan atau tidak; yang dikendalikan olehECHO
cflag innew_settings[3]
.)Akhirnya, ketika atribut baru diatur, panggilan akan berhasil jika ada pengaturan baru yang ditetapkan. Jika pengaturannya sensitif - misalnya, jika Anda meminta kata sandi pada baris perintah -, Anda harus mendapatkan pengaturan baru, dan memverifikasi bahwa tanda-tanda penting sudah diatur / tidak disetel dengan benar, untuk memastikan.
Jika Anda ingin melihat pengaturan terminal Anda saat ini, jalankan
Bendera input biasanya di baris keempat, dan bendera output di baris kelima, dengan
-
mendahului nama bendera jika bendera tidak disetel. Misalnya, outputnya bisaPada pseudoterminals, dan perangkat USB TTY, baud rate tidak relevan.
Jika Anda menulis skrip Bash yang ingin dibaca misalnya kata sandi, pertimbangkan idiom berikut:
The
EXIT
perangkap dijalankan setiap kali shell keluar. Thestty -g
membaca pengaturan saat ini terminal pada awal script, sehingga pengaturan saat dikembalikan ketika keluar skrip, secara otomatis. Anda bahkan dapat mengganggu skrip dengan Ctrl+ C, dan itu akan melakukan hal yang benar. (Dalam beberapa kasus sudut dengan sinyal, saya telah menemukan bahwa terminal kadang-kadang macet dengan pengaturan mentah / noncanonical (memerlukan satu untuk mengetikreset
+ Entersecara membabi buta di terminal), tetapi berjalanstty sane
sebelum mengembalikan pengaturan asli yang sebenarnya telah sembuh bahwa setiap kali untuk saya. Jadi itu sebabnya ada di sana; semacam keamanan tambahan.)Anda dapat membaca jalur input (tidak bertanda ke terminal) menggunakan
read
bash built-in, atau bahkan membaca input karakter demi karakter menggunakanJika Anda tidak disetel
IFS
ke ASCII NUL,read
built-in akan mengkonsumsi separator, sehinggac
akan kosong. Perangkap untuk pemain muda.sumber
Intinya "karena sudah dilakukan seperti itu sejak mesin tik manual". Sangat.
Mesin tik manual memiliki carriage tempat kertas diumpankan, dan bergerak maju saat Anda mengetik (memuat pegas), dan memiliki tuas atau kunci yang akan melepaskan carriage, membiarkan pegas mengembalikan carriage ke margin kiri.
Saat entri data elektronik (teletype, dll) diperkenalkan, mereka meneruskannya. Jadi Enterkunci pada banyak terminal akan diberi label Return.
Umpan garis terjadi (dalam proses manual) setelah mengembalikan carriage ke margin kiri. Sekali lagi, perangkat elektronik meniru perangkat manual, membuat line-feedoperasi terpisah .
Kedua operasi dikodekan (untuk memungkinkan teletype menjadi lebih dari perangkat mandiri yang menciptakan jenis kertas), jadi kami memiliki
CR
(carriage-return) danLF
(line-feed). Gambar ini dari ASR 33 Informasi Teletype menunjukkan keyboard, denganReturn
di sisi kanan, danLine-Feed
hanya ke kiri. Berada di kanan , itu adalah kunci utama:Unix datang kemudian. Pengembangnya suka mempersingkat hal-hal (lihat semua singkatan, bahkan
creat
untuk "buat"). Dihadapkan dengan proses dua bagian yang mungkin, mereka memutuskan bahwa umpan garis hanya masuk akal jika mereka didahului dengan carriage-return. Jadi mereka menjatuhkan pengembalian carriage eksplisit dari file , dan menerjemahkan Returnkunci terminal untuk mengirim umpan baris yang sesuai. Hanya untuk menghindari kebingungan, mereka menyebut umpan baris sebagai "baris baru".Saat menulis teks pada terminal, Unix menerjemahkan ke arah lain: umpan baris menjadi carriage-return / line-feed.
(Yaitu, "normal": apa yang disebut "mode matang", berbeda dengan mode "mentah" di mana tidak ada terjemahan yang dilakukan).
Ringkasan:
sumber
LF
diterjemahkan keCR LF
. Saat Anda mengetikfoo<Return>
dalam mode matang, aplikasi membacafoo\n
danfoo\r\n
dikirim kembali oleh disiplin garis untuk gema ke terminal.