Linux 명령에 대문자를 사용할 수 있습니까? 지원되는 것을 알고 있지만 "문제"인지 또는 "좋지 않은 것"으로 간주되는지 확인하고 싶습니까?
echo -e '#!/bin/sh\necho hello world' > ~/bin/OH\ NOES; chmod +x ~/bin/OH\ NOES; "OH NOES"생산 hello world예상대로. ( 물론 가정 ~/bin에 있습니다 $PATH).
Linux 명령에 대문자를 사용할 수 있습니까? 지원되는 것을 알고 있지만 "문제"인지 또는 "좋지 않은 것"으로 간주되는지 확인하고 싶습니까?
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:) 와 같은
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
우분투 12.04 전체에서 758입니다. 전체 목록 : https://gist.github.com/5264777
Xdialog? : o 그리고 grep실행하기 전에 쉘이 현재 디렉토리에서 확장하지 않도록 매개 변수를 인용해야합니다 .
bash홈 디렉토리에서 실제로 [A-Z]는 "cdfhjmpqrt"로 확장됩니다. 따라서 대소 문자를 구분하지 않습니다.
zshbash의 failglob옵션 은 말할 것도 없습니다 . 나는 개인적으로 일반적으로 (내 임시 파일 이름 ~) a, b, c... 그리고 내 임시 DIRS A, B, C...
가장 유명한 명령은 stty로 사용할 수 있습니다 STTY. 를 사용하여 터미널을 정상적인 동작으로 다시 설정하는 것이 매우 편리했습니다 STTY SANE.
/bin/stty다른 것이 없습니다. 답을 좀 더 정교하게 관리 하시겠습니까?
a하면 터미널이 나타납니다 A. 온전함을 복원하려면 stty sane명령을 사용하십시오 . 현재 불가능하다는 점을 제외하고 는 매우 환영받은 stty대로 사용할 수 STTY있었습니다. 나는 이것을 필요로했던 마지막 시간조차도 기억할 수 없다 :)
역사적 답변 에 대한 몇 가지 참고 사항 STTY은 다른 답변과 관련 의견 의 일부 부정확성을 분명히합니다 .
DEC VT05 또는 VT50 과 같은 이전 터미널과 그 이전 의 텔레 프린터는 대문자 만 지원했습니다. 즉, 소문자를 입력 할 수 없거나 대문자 이외의 다른 문자를 표시 할 수 없습니다.
유닉스는 대소 문자를 구분하고 대부분의 명령어는 소문자이므로 문제가 있음을 알 수 있습니다. 그렇기 때문에 특수 터미널 / 터미널 모드 (및 터미널이 오래 지나도 현대 Unices에 여전히 존재)가 있습니다.
termio / termios는 각각 Unix에서 tty 드라이버를 제어하기위한 이전 및 최신 인터페이스입니다. termio (s) ioctl에서 입력, 출력, 제어 플래그를 지정합니다. 직렬 라인의 전기 신호를 입력 및 출력 문자로 처리하는 방법과 echo, rrt 등과 같은 드라이버의 내부 동작을 지정합니다. 라인 에디터 ... 대부분은 최신 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 lcase
무엇이든 할 수 있습니다. 그러나 대문자 만 보낼 수있을 때 어떻게해야합니까? 이 곳에서에 STTY대한 별칭 으로 명령 이 필요한 곳이며에 대한 별칭으로 지원 되는 stty이유 입니다 .sttyLCASElcase
터미널이 모두 대문자 SANE일 stty sane때 원하지 않기 때문에 그러한 별칭 이 없습니다 .
일반 터미널에서 실수로 stty lcase또는 stty olcuc실수로 실행 하는 경우 ( xterm또는 최신 터미널 에서 시도 ), stty sane다시 정상으로 돌아 가기 위해 입력해야합니다 . 그러나 당신은 그것에 대한 STTY명령이 필요하지 않습니다 . 사용자가 입력하는 경우 stty sane, 당신은 것입니다 참조 STTY SANE다시 반향하지만 그것은 여전히입니다 만 번역 한 것입니다 표시된 텍스트 (안 입력 된 명령)입니다stty sane 실행됩니다 명령.
사람들은 iuclc, olcuc, xcase플래그는 POSIX에 의해 지정하는 데 사용 (그리고 리눅스에 구현 된 이유를 심각하게 사람이 이제까지) 재미보다 (다른 리눅스 시스템에 그 오래된 단말기의 연결 의심하더라도 그것은 아마) 만에 제거 된 POSIX : 2001.
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 (내가 가장 몰랐던).
데비안에 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입니다. 하나의 열과 같은 것.
zsh을 실행하십시오.type -m '*[A-Z]*'
$path는 bash에 없습니다. 정보가 많을수록 좋습니다.
$pathzsh을 특정하지 않습니다. 그것은 csh/tcsh당신의 명령이 작동하는 곳 에서 나옵니다 .
-m"일치"를위한 것 같아요 .)