Чи може команда Linux мати великі літери?


17

Чи може команда Linux мати великі літери? Я знаю, що це підтримується, але я хочу бути впевненим, чи це "проблема" чи вважається "не хорошою справою"?


6
Конвенція UNIX полягає у використанні малих літер для імен команд, але ви можете їх називати все, що завгодно.

1
Дійсно, UNIX не хвилює, як ви називаєте свої команди. Це викличе багато болю і страждань, але ви навіть можете мати команди з пробілами в них: echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"виробляє , hello worldяк і очікувалося. (Якщо , звичайно, ~/binє у вас $PATH).
derobert

Ознайомтесь із цим питанням та моїм, можливо, занадто довгим підручником .
Емануель Берг

Відповіді:


13

У Unix немає обмежень для імен команд. Будь-який файл може бути командою. І ім'ям файлу може бути будь-яка послідовність одного або декількох символів (окрім обмеження) символів, відмінних від ASCII NUL або ASCII /. zshнавіть скасовує обмеження для функцій, де ви можете мати будь-яку рядок як назву функції.

Кілька приміток, хоча:

  • вам буде важко створити командний файл під назвою .або ..;-).
  • імена остерігайтеся, які вже прийняті стандартними командами або оболонок вбудованих команд або ключовими словами (принаймні з найбільш поширених оболонок , такі як bash, zsh, tcshабо ksh). У цьому плані символи верхнього регістру можуть допомогти, оскільки вони, як правило, не використовуються стандартними командами.
  • Краще обмежитися символами ASCII. Символи, що не належать до ASCII, не виражаються однаково в різних наборах символів, які знаходяться там
  • поки ви на цьому, обмежтеся літерами, цифрами, тире, крапкою та підкресленням. Все інше, в той час як юридичні, можуть привести ті чи інші проблеми з тієї чи іншої інструмент (наприклад, |, =, &і багато інших повинні бути екрановані в оболонках, якщо ви використовуєте :, ваша команда не може бути використана в якості свого входу в шкаралупі ... ). Ви навіть можете виключити .і -які не дозволені в назвах функцій у багатьох оболонках, якщо ви хочете дозволити користувачам перетворити вашу команду у функцію оболонки.
  • Складіть першим символом букву. Знову ж таки, не сувора вимога. Але підкреслення іноді використовується для спеціальних речей (наприклад, у zshфункціях, що починаються з систем завершення _), і багатозначні команди можуть бути проблемою в таких речах cmd>output.log. Файли, ім’я яких починається з крапки, будуть приховані такими речами, як lsабо оболонка глобінг та багато файлових менеджерів.

Правильно. Тому я думаю, що це зводиться до цього, не використовуйте нічого незвичайного, якщо у вас немає вагомих причин для цього. Навіть ваш другий пункт, я не думаю, що використання великих букв для покриття цих оболонок є таким розумним - хіба не краще назвати команду для опису змін? Мовляв, zsh_with_some_funky_option(замість ZSH)?
Емануель Берг

Псевдонім - це команда? Тому що якщо так, мені було дуже просто набрати текст alias .="echo Hello".-) (Ну, sudo vim /bin/.було важче, хоча ...)
Алоїс Магдал

@AloisMahdal Ось чому я сказав командний файл . zsh також дозволяє .() echo Hello. Так само і pdksh, але .особливий вбудований має перевагу там.
Стефан Шазелас

На жаль, мій непрочитаний ... Цікавий момент щодо пріоритетів pdksh, хоча ...
Alois Mahdal

27

Так, це може бути, і їх вже є кілька. Такі як /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

Так що це 758 у всіх Ubuntu 12.04. Повний список: https://gist.github.com/5264777


Ні Xdialog? : o І слід вказати grepпараметр, щоб уникнути розширення оболонки в поточному каталозі перед виконанням.
манатура

Не встановлюйте його в цій системі :)
Dennis Kaarsemaker

2
Я хотів би наполягати на цитуванні grepпараметра: pastebin.com/Gak7x9rN (Так, я можу сам це відредагувати, але я вважаю за краще ви розумієте, чому.)
манатура

1
Ну, це може залежати і від оболонки. Я використовував великі регістри в своєму прикладі для портативності, але мій bashв моєму домашньому каталозі фактично витрачає [A-Z]на "cdfhjmpqrt". Тож справи нечутливі.
манатура

1
Не кажучи вже zshпро failglobваріант башу . Я особисто , як правило , називають свої тимчасові файли (в ~) a, b, c... і мій тимчасові каталоги A, B, C...
Stéphane Chazelas

4

Найвідоміша команда - це stty , яка також була доступна як STTY. Було дуже зручно повернути термінал до нормальної поведінки STTY SANE.


У мене немає, /bin/sttyале нічого іншого. Хочете трохи розробити свою відповідь?
Емануель Берг

2
У старі добрі часи ваш термінал став настільки накручений, що все було велике. Тому наберіть aі термінал побачить A. Щоб відновити розум, ви використовували б stty saneкоманду. За винятком того, що зараз це неможливо, тому sttyдоступність, як STTYбуло дуже вітається. Я навіть не можу згадати останній раз, коли мені це було потрібно :)
Dennis Kaarsemaker

@DennisKaarsemaker: WOW! Це якийсь класний фрагмент історії!
Емануель Берг

1
Хлопці (ott-- і @DennisKaarsemaker), у вас це назад. Я розмістив ще одну відповідь для роз’яснення.
Стефан Шазелас

4

Кілька приміток до історичного STTY команди, щоб з’ясувати деякі неточності в іншій відповіді та пов'язані з цим коментарі :

Більш ранні термінали, як DEC VT05 або VT50, і телепринтери до цього підтримували лише великі символи. Це означало, що жоден нижній регістр ніколи не може бути введений від них або що вони не зможуть відобразити жодну іншу літеру, ніж великі регістри.

У Unix, що відрізняється регістром, і більшість команд є нижньою літерою, ви можете бачити там проблему. Ось чому існують спеціальні режими terio / terios (і вони все ще існують в сучасних Unice, хоча цих терміналів вже давно немає) для їх обробки.

Терміни / терміни - це відповідно старші та новіші інтерфейси для управління драйвером tty в Unix. У термініioctl ви вказуєте вхідні, вихідні, прапори управління ..., які визначають, як електричні сигнали в послідовної лінії обробляються вхідними та вихідними символами, а також внутрішня поведінка драйвера, наприклад, ехо, редактор рядків ... Більшість із них стосується віртуальних терміналів, таких як сучасні консолі VGA Unix або псевдотермінали.

Інтерфейсом командного рядка до termio(s)єstty команда.

Для обробки великих регістрів termio(s)задіяні три прапори:

  • IUCLC(Верхній регістр введення в нижній регістр): вхідні символи перетворюються на малі регістри при введенні. Це означає, що Aвідправлений терміналом розглядається як a a. Це означає, що ввімкнувши це, я тепер можу набрати LSсвій VT50, і оболонка буде читати lsз /dev/ttyX. Тепер я також можу запустити sttyкоманду.
  • Тепер, будучи IUCLCсамотнім і термінальним echo, поки я набираю LS, драйвер буде надсилати lsназад до терміналу (щоб я міг бачити, що я набираю), який він не може відображати, тому нам також потрібноOLCUC (Output нижній регістр у верхній регістр), тобто нам потрібно перетворити будь-які маленькі літери в великі регістри, перш ніж надсилати в термінал.
  • Тепер ми можемо управляти Unix від VT50, але що робити, якщо ми хочемо зараз ввести великі символи? Ось де вводиться xcase локальний прапор. Це дозволяє (лише в канонічному режимі введення) надсилати верхній регістр Aшляхом введення \A, а на виході верхній регістр Aвідображається як \A. (що не реалізовано в Linux)

sttyКоманда має відповідну iuclc, olcucі xcaseнастройку і псевдонім для всіх трьох: lcase. Налаштування за замовчуванням і те, що ви отримуєте після stty sane, lcaseвимкнено.

Отже, коли ви перебуваєте на VT50, все, що вам потрібно зробити, це запустити:

stty lcase

вміти щось робити. Але тримайте, як це зробити, коли ви можете надсилати лише великі літери? Ось де вам потрібна STTYкоманда як псевдонім для stty, і саме тому sttyпідтримується LCASEяк псевдонім для lcase.

Такого SANEпсевдоніма немає, тому що ви не хочете робити це, stty saneколи ваш термінал є великим.

Якщо ви запустите stty lcaseабо stty olcucпомилково на звичайному терміналі (спробуйте його xtermабо будь-який сучасний термінал), саме там вам потрібно ввести, stty saneщоб повернутися до нормального. Але вам для цього не потрібна STTYкоманда. Якщо ви набираєте stty sane, ви будете дивитися STTY SANEвідлуння, але це тільки відображається текст (не ввійшли команди) , які будуть переведені, це по - , як і ранішеstty sane команда , яка буде працювати.

Ті iuclc, olcuc, xcaseвикористовувані прапори, які вказуються POSIX (і це, ймовірно , чому він реалізований на Linux , хоча я серйозно сумніваюся , що хто - небудь коли - або підключений будь-який з цих старих терміналів в системі Linux (крім для задоволення)), але були вилучені POSIX: 2001.


2

Про Fedora 18 тут:

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

Всього 50 (з яких я не знав більшості).


1
50, але 25 виразних.
Стефан Шазелас

0

На Debian sid, з zsh, і ls -1 $path | grep '[A-Z]', я отримую

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

Редагувати: Зауважте, що в команді, наведеній вище, це цифра, а не літера l. Один як в одній колонці.


1
З zsh, бігайте:type -m '*[A-Z]*'
Стефан Шазелас

@StephaneChazelas: Гаразд, ваш відображає шлях пошуку, а також включає функції оболонки. Але мій також zsh-специфічний: малі регістри $pathне в баші, жодного разу. Ну, чим більше інформації, тим краще.
Емануель Берг

1
Так, я не сказав, що ваша помилялася, просто запропонувала альтернативу (хоча я погодився, що це було не найкраще з формулювань). Зверніть увагу, що $pathне zsh конкретно. Він походить з того місця, csh/tcshде також працює ваша команда.
Стефан Шазелас

@StephaneChazelas: Ага, це цікаво! Ні, моя команда не "неправильна", але я погоджуюся, що ваша краще, тому що має сенс включати функції оболонки та псевдоніми. Принаймні для мене це робить, тому що коли я користуюсь своїм комп’ютером, мені байдуже, чи це двійковий файл, сценарій, функція, псевдонім чи будь-що інше, доки я можу його запустити і він виконує свою роботу. (Я здогадуюсь, -mце "матч".)
Емануель Берг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.