Может ли команда 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, конечно).
Дероберт
Проверьте этот вопрос и мой, возможно, слишком длинный учебник .
Эмануэль Берг

Ответы:

13

В Unix нет ограничений на имена команд. Любой файл может быть командой. И имя файла может быть любой последовательностью из одного или нескольких (хотя и не более) символов, отличных от ASCII NUL или ASCII /. zshдаже снимает это ограничение для функций, где вы можете иметь любую строку в качестве имени функции.

Несколько заметок, хотя:

  • вам будет сложно создать командный файл с именем .or ..;-).
  • имена остерегайтесь, которые уже приняты стандартными командами или оболочек встроенных команд или ключевыми словами (по крайней мере из наиболее распространенных оболочек , такие как 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, но .специальная встроенная функция имеет преимущество.
Стефан Шазелас
Ой, мое неверное прочтение ... Интересная точка зрения о предшественниках ПДКШ, хотя ...
Алоис Махдал
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параметр, чтобы избежать расширения оболочки в текущем каталоге перед выполнением.
manatwork
Не установить его в этой системе :)
Деннис Каарсемакер
2
Я хотел бы настаивать на цитировании grepпараметра: pastebin.com/Gak7x9rN (Да, я могу редактировать его сам, но я предпочитаю, чтобы вы поняли почему.)
manatwork
1
Ну, это может зависеть и от оболочки. Я использовал верхний регистр в моем примере для переносимости, но мой bashв моем домашнем каталоге фактически расширяется [A-Z]до «cdfhjmpqrt». Так что без учета регистра.
Манатворк
1
Не говоря уже zshо failglobварианте Bash . Я лично , как правило , называют свои временные файлы (в ~) a, b, c... и мой временные каталоги A, B, C...
Stéphane Chazelas
4

Самая известная команда stty, которая также была доступна как STTY. Это было очень удобно, чтобы вернуть терминал к нормальному поведению с STTY SANE.

ott--
источник
У меня есть, /bin/sttyно больше ничего. Хотите немного проработать свой ответ?
Эмануэль Берг
2
В старые добрые времена ваш терминал мог быть настолько испорчен, что все было в верхнем регистре. Так что типа aи терминал увидит A. Чтобы восстановить здравомыслие, вы должны использовать stty saneкоманду. За исключением того, что это сейчас невозможно, поэтому иметь в sttyналичии STTYочень приветствуется. Я даже не могу вспомнить, когда в последний раз мне это было нужно :)
Деннис Каарсемейкер,
@DennisKaarsemaker: ВАУ! Это какой-то крутой кусок истории!
Эмануэль Берг
1
Ребята (ott-- и @DennisKaarsemaker), у вас это задом наперед. Я отправил другой ответ для разъяснения.
Стефан Шазелас
4

Несколько замечаний по исторической STTYкоманде, чтобы прояснить некоторые неточности в другом ответе и связанных комментариях :

Более ранние терминалы, такие как DEC VT05 или VT50 и телепринтеры до этого, поддерживали только символы верхнего регистра. Это означало, что ни один символ нижнего регистра никогда не мог быть введен от них или что они не могли бы отображать любые другие буквы, кроме прописных.

Unix чувствителен к регистру, а большинство команд - в нижнем регистре, вы можете видеть, что здесь есть проблема. Вот почему существуют специальные режимы termio / termios (и они все еще существуют в современных Unices, хотя эти терминалы давно исчезли) для их обработки.

termio / termios - соответственно старый и новый интерфейсы для управления драйвером tty в Unix. В термине (ах) ioctlвы указываете ввод, вывод, управляющие флаги ... которые определяют, как электрические сигналы в последовательной линии должны обрабатываться во входных и выходных символах, а также внутреннее поведение драйвера в таких вещах, как эхо, линейный редактор ... Большинство из них применимы к виртуальным терминалам, таким как современные Unix VGA-консоли или псевдо-терминалы.

Интерфейс командной строки termio(s)является sttyкомандой.

Для обработки терминалов в верхнем регистре используются три termio(s)флага:

  • IUCLC(Ввод заглавных букв в нижний регистр): входящие символы преобразуются в нижний регистр при вводе. Это означает, что Aотправленный терминалом считается как a. Это означает, что с этим я могу теперь печатать LSна моем VT50, и оболочка будет читать lsс /dev/ttyX. Теперь я также могу запустить sttyкоманду.
  • Теперь, когда IUCLCодин и терминал echo, когда я печатаю LS, драйвер отправляет lsобратно на терминал (чтобы я мог видеть то, что я печатаю), который он не может отобразить, поэтому нам также нужно OLCUC(вывод нижнего регистра в верхний регистр), то есть перед отправкой на терминал нам нужно преобразовать любую строчную букву в прописную.
  • Теперь мы можем работать с 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 (из которых я не знал больше всего).

vonbrand
источник
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]*'
Стефан Chazelas
@StephaneChazelas: ОК, ваш отображает путь поиска, а также включает в себя функции оболочки. Но мой также специфичен для zsh: строчные буквы $pathне в bash, на этот раз. Ну, чем больше информации, тем лучше.
Эмануэль Берг
1
Да, я не сказал, что вы ошиблись, просто предложил альтернативу (хотя я согласен, что это не лучшая формулировка). Обратите внимание, что $pathэто не специфично для Zsh. Это происходит от того, csh/tcshгде ваша команда также работает.
Стефан Шазелас
@StephaneChazelas: Ага, это интересно! Нет, моя команда не является «неправильной», но я согласен, что ваша команда лучше, потому что имеет смысл включать функции оболочки и псевдонимы. По крайней мере, для меня это так, потому что когда я использую свой компьютер, мне все равно, является ли он двоичным файлом, сценарием, функцией, псевдонимом или чем-то еще, если я могу его запустить и он выполняет свою работу. (Я думаю, -mэто для "матча".)
Эмануэль Берг