Может ли команда Linux иметь заглавные буквы? Я знаю, что это поддерживается, но я хочу быть уверенным, если это «проблема» или считается «не очень хорошая вещь»?
linux
shell
command-line
Тердон
источник
источник
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"
производитhello world
как ожидалось. (Предположим~/bin
, в вашем$PATH
, конечно).Ответы:
В Unix нет ограничений на имена команд. Любой файл может быть командой. И имя файла может быть любой последовательностью из одного или нескольких (хотя и не более) символов, отличных от ASCII NUL или ASCII
/
.zsh
даже снимает это ограничение для функций, где вы можете иметь любую строку в качестве имени функции.Несколько заметок, хотя:
.
or..
;-).bash
,zsh
,tcsh
илиksh
). В этом отношении символы верхнего регистра могут помочь, поскольку они обычно не используются стандартными командами.|
,=
,&
и многие другие должны быть экранированы в оболочках, если вы используете:
, ваша команда не может быть использована в качестве своего входа в скорлупе ... ). Вы можете даже захотеть исключить.
и-
которые не разрешены в именах функций во многих оболочках, в случае, если вы хотите разрешить пользователям заключать вашу команду в функцию оболочки.zsh
функциях, начинающихся с систем завершения_
), и в таких вещах могут быть проблемы с командами из всех цифрcmd>output.log
. Файлы, имена которых начинаются с точки, будут скрыты такими вещами, какls
глобализация или оболочка и многие файловые менеджеры.источник
zsh_with_some_funky_option
(вместоZSH
)?alias .="echo Hello"
.-) (Ну,sudo vim /bin/.
было сложнее, хотя ...).() echo Hello
. Так же как и pdksh, но.
специальная встроенная функция имеет преимущество.Да, может, и уже есть несколько. Такие как
/usr/bin/X
:)Так что это 758 во всей Ubuntu 12.04. Полный список: https://gist.github.com/5264777
источник
Xdialog
? : o И вы должны заключить в кавычкиgrep
параметр, чтобы избежать расширения оболочки в текущем каталоге перед выполнением.grep
параметра: pastebin.com/Gak7x9rN (Да, я могу редактировать его сам, но я предпочитаю, чтобы вы поняли почему.)bash
в моем домашнем каталоге фактически расширяется[A-Z]
до «cdfhjmpqrt». Так что без учета регистра.zsh
оfailglob
варианте Bash . Я лично , как правило , называют свои временные файлы (в~
)a
,b
,c
... и мой временные каталогиA
,B
,C
...Самая известная команда
stty
, которая также была доступна какSTTY
. Это было очень удобно, чтобы вернуть терминал к нормальному поведению сSTTY SANE
.источник
/bin/stty
но больше ничего. Хотите немного проработать свой ответ?a
и терминал увидитA
. Чтобы восстановить здравомыслие, вы должны использоватьstty sane
команду. За исключением того, что это сейчас невозможно, поэтому иметь вstty
наличииSTTY
очень приветствуется. Я даже не могу вспомнить, когда в последний раз мне это было нужно :)Несколько замечаний по исторической
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
(вывод нижнего регистра в верхний регистр), то есть перед отправкой на терминал нам нужно преобразовать любую строчную букву в прописную.xcase
локальный флаг. Это позволяет (только в режиме канонического ввода) отправлять верхний регистрA
, печатая\A
, а на выходе верхний регистрA
отображается как\A
. (этот не реализован в Linux)stty
Команда имеет соответствующуюiuclc
,olcuc
иxcase
настройку и псевдоним для всех трех:lcase
. Настройка и то , что вы получаете по умолчанию после того, какstty sane
этоlcase
прочь.Итак, когда вы на VT50, все, что вам нужно сделать, это запустить:
быть в состоянии сделать что-нибудь. Но подожди, как ты это делаешь, когда можешь отправлять только заглавные буквы? Вот где вам нужна
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.источник
На Fedora 18 здесь:
В общей сложности 50 (из которых я не знал больше всего).
источник
На Debian sid, с Zsh, и
ls -1 $path | grep '[A-Z]'
я получаюИзменить: Обратите внимание, что в приведенной выше команде это цифра один, а не буква
l
. Один, как в одном столбце.источник
zsh
, запустить:type -m '*[A-Z]*'
$path
не в bash, на этот раз. Ну, чем больше информации, тем лучше.$path
это не специфично для Zsh. Это происходит от того,csh/tcsh
где ваша команда также работает.-m
это для "матча".)