Bisakah perintah Linux menggunakan huruf besar?


17

Bisakah perintah Linux menggunakan huruf besar? Saya tahu ini didukung tetapi saya ingin memastikan apakah itu "masalah" atau dianggap "bukan hal yang baik"?


6
Konvensi UNIX adalah menggunakan huruf kecil untuk nama perintah, tetapi Anda bebas untuk memanggil mereka apa pun yang Anda inginkan.

1
Memang, UNIX tidak peduli apa yang Anda sebut perintah Anda. Ini akan menyebabkan banyak rasa sakit dan penderitaan, tetapi Anda bahkan dapat memiliki perintah dengan spasi di dalamnya: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"menghasilkan hello worldseperti yang diharapkan. (Dengan asumsi ~/binada di Anda $PATH, tentu saja).
derobert

Lihat pertanyaan ini dan mungkin tutorial saya terlalu lama .
Emanuel Berg

Jawaban:


13

Tidak ada batasan nama perintah di Unix. File apa pun bisa menjadi perintah. Dan nama file dapat berupa urutan satu atau lebih (hingga batas tertentu) karakter selain ASCII NUL atau ASCII /. zshbahkan mengangkat batasan itu untuk fungsi di mana Anda dapat memiliki string apa pun sebagai nama fungsi.

Beberapa catatan:

  • Anda akan memiliki waktu yang sulit membuat file perintah yang disebut .atau ..;-).
  • nama hindari yang sudah diambil oleh perintah standar atau builtin shell atau kata kunci (setidaknya yang paling kerang umum seperti bash, zsh, tcshatau ksh). Dalam hal ini karakter huruf besar dapat membantu karena umumnya tidak digunakan oleh perintah standar.
  • Lebih baik untuk membatasi ke karakter ASCII. Karakter non ASCII tidak diekspresikan sama di berbagai set karakter yang ada di luar sana
  • saat Anda melakukannya, batasi diri Anda untuk huruf, angka, tanda hubung, titik dan garis bawah. Ada lagi, sementara hukum, dapat menyebabkan satu masalah atau yang lain dengan ini atau itu alat (misalnya, |, =, &dan banyak orang lain akan perlu melarikan diri dalam kerang, jika Anda menggunakan :, perintah Anda tidak dapat digunakan sebagai seseorang shell login ... ). Anda bahkan mungkin ingin mengecualikan .dan -yang tidak diizinkan dalam nama fungsi di banyak shell, jika Anda ingin mengizinkan pengguna untuk membungkus perintah Anda dalam fungsi shell.
  • Buat karakter pertama menjadi huruf. Sekali lagi, bukan persyaratan yang ketat. Tapi garis bawah kadang-kadang digunakan untuk hal-hal khusus (seperti dalam zshfungsi dari sistem penyelesaian dimulai dengan _), dan perintah semua digit bisa menjadi masalah dalam hal-hal seperti cmd>output.log. File yang namanya dimulai dengan titik akan disembunyikan oleh hal-hal seperti lsatau shell globbings dan banyak manajer file.

Baik. Jadi saya kira itu intinya, jangan gunakan sesuatu yang luar biasa kecuali Anda memiliki alasan yang baik untuk melakukannya. Bahkan poin kedua Anda, saya tidak berpikir menggunakan huruf besar untuk menutupi shell itu sepintar itu - bukankah lebih baik untuk memberi nama perintah untuk menggambarkan perubahan? Suka, zsh_with_some_funky_option(bukan ZSH)?
Emanuel Berg

Apakah alias perintah? Karena jika ya, saya memiliki waktu yang sangat mudah mengetik alias .="echo Hello".-) (Yah, sudo vim /bin/.lebih sulit, meskipun ...)
Alois Mahdal

@AloisMahdal Itu sebabnya saya katakan file perintah . zsh juga memungkinkan .() echo Hello. Begitu juga pdksh, tetapi .builtin khusus diutamakan di sana.
Stéphane Chazelas

Ups, salah baca saya ... Poin menarik tentang presedensi pdksh, meskipun ...
Alois Mahdal

27

Ya itu bisa, dan sudah ada beberapa. Seperti /usr/bin/X:)

dennis@lightning:~$ ls {/usr{/local,},}/{s,}bin | grep '[A-Z]'
MAKEDEV
amuFormat.sh
GET
HEAD
Mail
POST
X
X11
Xephyr
Xnest
Xorg
NetworkManager

dennis@lightning:~$ zcat ~/.cache/apt-file /archive.ubuntu.com_ubuntu_dists_precise_Contents-i386.gz | tail -n +33 | cut -f1 | grep -P '^(usr/)?s?bin/.*[A-Z]' | wc -l
758

Jadi itu 758 di semua Ubuntu 12,04. Daftar lengkap: https://gist.github.com/5264777


Tidak ada Xdialog? : o Dan Anda harus mengutip grepparameter untuk menghindari shell memperluasnya di direktori saat ini sebelum eksekusi.
manatwork

Jangan menginstalnya pada sistem ini :)
Dennis Kaarsemaker

2
Saya ingin menekankan pada grepparameter mengutip : pastebin.com/Gak7x9rN (Ya, saya dapat mengeditnya sendiri, tetapi saya lebih suka Anda mengerti mengapa.)
manatwork

1
Yah, itu mungkin tergantung pada shell juga. Saya menggunakan huruf besar dalam contoh saya untuk portabilitas, tetapi saya bashdi direktori home saya benar-benar [A-Z]dikeluarkan untuk "cdfhjmpqrt". Jadi kasus tidak sensitif.
manatwork

1
Belum lagi opsi zshatau bash failglob. Saya pribadi biasanya nama file temp saya (di ~) a, b, c... dan saya suhu dirs A, B, C...
Stéphane Chazelas

4

Perintah yang paling terkenal adalah stty, yang juga tersedia sebagai STTY. Sangat berguna untuk mengatur terminal kembali ke perilaku normal STTY SANE.


Saya memiliki /bin/sttytetapi tidak ada yang lain. Ingin sedikit menguraikan jawaban Anda?
Emanuel Berg

2
Di masa lalu yang indah, terminal Anda mungkin menjadi sangat kacau, semuanya menjadi huruf besar. Jadi ketik adan terminal akan melihat A. Untuk mengembalikan kewarasan, Anda akan menggunakan stty saneperintah. Kecuali bahwa ini sekarang tidak mungkin, karena itu sttytersedia sebagai STTYsangat disambut. Saya bahkan tidak ingat kapan terakhir kali saya membutuhkan ini :)
Dennis Kaarsemaker

@DennisKaarsemaker: WOW! Itu adalah bagian yang keren dari sejarah!
Emanuel Berg

1
Guys (ott-- dan @DennisKaarsemaker), Anda memilikinya mundur. Saya sudah mengirim jawaban lain untuk klarifikasi.
Stéphane Chazelas

4

Beberapa catatan tentang STTYperintah historis untuk mengklarifikasi beberapa ketidakakuratan dalam jawaban lain dan komentar terkait :

Terminal sebelumnya seperti DEC VT05 atau VT50 dan teleprinters sebelumnya hanya mendukung karakter huruf besar. Yang dimaksud adalah bahwa tidak ada karakter huruf kecil yang dapat menjadi input dari mereka atau bahwa mereka tidak akan dapat menampilkan huruf selain huruf besar.

Unix peka huruf besar kecil dan sebagian besar perintah menjadi huruf kecil, Anda dapat melihat ada masalah di sana. Itu sebabnya ada mode termio / termios khusus (dan yang masih ada di Unites modern meskipun terminal tersebut sudah lama hilang) untuk menangani hal itu.

termio / termios masing-masing adalah antarmuka yang lebih lama dan lebih baru untuk mengontrol driver tty di Unix. Dalam termio (s) ioctl, Anda menentukan input, output, bendera kontrol ... yang menentukan bagaimana sinyal listrik pada garis serial harus ditangani menjadi karakter input dan output dan perilaku internal driver wrt hal-hal seperti gema, editor baris ... Sebagian besar berlaku untuk terminal virtual seperti konsol Unix VGA modern atau terminal semu.

Antarmuka baris perintah termio(s)adalah sttyperintah.

Untuk menangani terminal huruf besar, ada tiga termio(s)flag yang terlibat:

  • IUCLC(Input Huruf Besar ke Huruf Kecil): karakter yang masuk dikonversi ke huruf kecil saat diinput. Itu berarti Apengiriman oleh terminal dianggap sebagai a a. Itu berarti bahwa dengan ini aktif, sekarang saya bisa mengetikkan LSVT50 saya, dan shell akan membaca lsdari /dev/ttyX. Saya juga sekarang dapat menjalankan sttyperintah.
  • Sekarang, dengan IUCLCsendirian dan terminal echo, saat saya mengetik LS, pengemudi akan mengirim lskembali ke terminal (sehingga saya dapat melihat apa yang saya ketik) yang tidak dapat ditampilkan, jadi kami juga perlu OLCUC(Output Huruf Kecil ke Huruf Besar), yaitu kita perlu mengubah huruf kecil menjadi huruf besar sebelum mengirim ke terminal.
  • Sekarang, kita dapat mengoperasikan Unix dari VT50, tetapi bagaimana jika kita ingin memasukkan karakter huruf besar sekarang? Di situlah flag xcase lokal masuk. Ini memungkinkan (hanya dalam mode input kanonik) mengirim huruf besar Adengan mengetik \A, dan pada output, huruf besar Aditerjemahkan sebagai \A. (yang tidak diimplementasikan di Linux)

The sttyperintah memiliki yang sesuai iuclc, olcucdan xcasepengaturan dan alias untuk ketiga: lcase. Pengaturan default dan apa yang Anda dapatkan stty sanetidak lcaseaktif.

Jadi, ketika Anda menggunakan VT50, yang perlu Anda lakukan adalah menjalankan:

stty lcase

untuk dapat melakukan apa saja. Tetapi tunggu dulu, bagaimana Anda melakukannya ketika Anda hanya bisa mengirim huruf besar? Di situlah Anda memerlukan STTYperintah sebagai alias untuk stty, dan itulah sebabnya sttymendukung LCASEsebagai alias untuk lcase.

Tidak ada SANEalias seperti itu karena Anda tidak ingin melakukan stty saneketika terminal Anda adalah huruf kapital semua.

Jika Anda menjalankan stty lcaseatau stty olcucsecara tidak sengaja pada terminal normal (coba di xtermatau terminal modern), di situlah Anda harus masuk stty saneuntuk kembali ke normal. Tetapi Anda tidak perlu STTYperintah untuk itu. Jika Anda mengetik stty sane, Anda akan melihat STTY SANEkembali bergema, tapi itu hanya teks yang ditampilkan (bukan perintah yang dimasukkan) yang akan diterjemahkan, itu masih stty saneperintah yang akan dijalankan.

Mereka iuclc, olcuc, xcasebendera yang digunakan akan ditentukan oleh POSIX (dan itulah mungkin mengapa ini diterapkan di Linux meskipun saya benar-benar ragu ada yang pernah terhubung salah satu dari mereka terminal lama ke sistem Linux (selain untuk bersenang-senang)), tetapi telah dihapus di POSIX: 2001.


2

Pada Fedora 18 di sini:

amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager
amuFormat.sh
chkrootkitX
enum_chmLib
enumdir_chmLib
extract_chmLib
fakeCMY
GET
HEAD
Mail
oLschema2ldif
POST
smoltDeleteProfile
smoltGui
smoltSendProfile
smp_conf_zone_man_pass.#prelink#.coLtYv
Terminal
test_chmLib
Thunar
X
Xephyr
xfig-Xaw3d
Xorg
Xvnc
MAKEDEV
NetworkManager

Total 50 (yang saya tidak tahu kebanyakan).


1
50, tapi 25 yang berbeda.
Stéphane Chazelas

0

Di sisi Debian, dengan zsh, dan ls -1 $path | grep '[A-Z]', saya mengerti

GET
HEAD
HtFileType
Mail
POST
Pnews
Rnmail
X
X11
Xephyr
Xorg
ircII
amuFormat.sh
hpljP1005
hpljP1006
hpljP1007
hpljP1008
hpljP1505

Sunting: Perhatikan bahwa, dalam perintah di atas, itu yang digit, bukan hurufnya l. Satu seperti dalam satu kolom.


1
Dengan zsh, jalankan:type -m '*[A-Z]*'
Stéphane Chazelas

@StephaneChazelas: Oke, milik Anda menampilkan jalur pencarian, dan juga menyertakan fungsi shell. Tapi milik saya juga khusus-zsh: huruf kecil $pathtidak dalam bash, untuk sekali. Nah, semakin banyak informasi, semakin baik.
Emanuel Berg

1
Ya, saya tidak mengatakan bahwa Anda salah, hanya menyarankan alternatif (meskipun saya setuju itu bukan yang terbaik dari kata-kata). Perhatikan bahwa $pathini tidak spesifik zsh. Itu datang dari csh/tcshtempat perintah Anda juga bekerja.
Stéphane Chazelas

@StephaneChazelas: Aha, itu menarik! Tidak, perintah saya tidak "salah" tapi saya setuju Anda lebih baik karena masuk akal untuk memasukkan fungsi dan alias shell. Setidaknya bagi saya, karena ketika saya menggunakan komputer saya, saya tidak peduli apakah itu biner, skrip, fungsi, alias, atau apa pun, selama saya bisa menjalankannya dan ia melakukan tugasnya. (Saya kira -mini untuk "pertandingan".)
Emanuel Berg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.