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

질문 과 아마도 너무 긴 튜토리얼을 확인하십시오 .
Emanuel Berg

답변:


13

Unix에서는 명령 이름에 제한이 없습니다. 모든 파일은 명령이 될 수 있습니다. 그리고 파일 이름은 ASCII NUL 또는 ASCII 이외의 하나 이상의 문자 시퀀스로 구성 될 수 있습니다./ . zsh함수 이름으로 문자열을 가질 수있는 함수에 대한 제한도 해제합니다.

그래도 몇 가지 참고 사항 :

  • .or 라는 명령 파일을 만드는 데 어려움을 겪을 것입니다.. ;-) 겪을 것입니다.
  • 이미 표준 명령 또는 쉘 내장 명령 또는 키워드 (가장 일반적인 쉘의 이상 등으로 촬영을 피 이름 bash, zsh, tcsh또는 ksh). 이와 관련하여 대문자는 일반적으로 표준 명령에서 사용되지 않으므로 도움이 될 수 있습니다.
  • ASCII 문자로 제한하는 것이 좋습니다. ASCII가 아닌 문자는 다양한 문자 세트에서 동일하게 표현되지 않습니다.
  • 당신이 그것을하는 동안 문자, 숫자, 대시, 점 및 밑줄로 자신을 제한합니다. 다른 건, 법적하면서,이 또는 도구 (예를 들어,있는 한 가지 문제 또는 다른 발생할 수 |, =, &그리고 많은 다른 사람이 사용하는 경우, 쉘 이스케이프 될 필요가있을 것이다 :, 당신의 명령은 하나의 로그인 쉘로 사용할 수 없습니다 ... ). 당신은 제외 할 수 있습니다 .그리고 -당신은 사용자가 쉘 함수에서 명령을 포장 할 수 있도록 할 경우에 대비하는 많은 껍질에 함수 이름에 사용할 수 없습니다.
  • 첫 번째 문자를 문자로 만듭니다. 다시 말하지만, 엄격한 요구 사항은 아닙니다. 그러나 밑줄은 때때로 zsh완성 시스템의 기능에서 와 같이 특수한 목적으로 사용 _되며 모든 자리 명령은와 같은 문제가 될 수 있습니다 cmd>output.log. 이름이 점으로 시작하는 파일은 ls쉘 글 로빙 및 많은 파일 관리자와 같은 것으로 숨겨집니다 .

권리. 따라서 그 이유가 없다면 평범하지 않은 것을 사용하지 마십시오. 두 번째 요점조차도 대문자를 사용하여 쉘을 다루는 것이 똑똑하지 않다고 생각합니다. 변경 사항을 설명하는 명령의 이름을 지정하는 것이 낫지 않습니까? 처럼 zsh_with_some_funky_option() 대신 ZSH?
Emanuel Berg

별명은 명령입니까? alias .="echo Hello"그렇다면 .-)를 입력하는 것이 매우 쉬웠 기 때문입니다 .-) (글쎄 sudo vim /bin/., 힘들었지 만 ...)
Alois Mahdal

@AloisMahdal 그게 내가 명령 파일을 말한 이유 입니다. zsh도 허용 .() echo Hello합니다. pdksh도 마찬가지이지만 .특별한 내장 기능이 우선합니다.
Stéphane Chazelas

죄송합니다, 오해 ... 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

우분투 12.04 전체에서 758입니다. 전체 목록 : https://gist.github.com/5264777


아니 Xdialog? : o 그리고 grep실행하기 전에 쉘이 현재 디렉토리에서 확장하지 않도록 매개 변수를 인용해야합니다 .
manatwork

이 시스템에 설치되어 있지 않은 :)
Dennis Kaarsemaker

2
pastebin.com/Gak7x9rN (예, 직접 편집 할 수 있지만 그 이유를 이해하는 것이 좋습니다) 를 인용하여 grep매개 변수 를 인용하고 싶습니다 .
manatwork

1
글쎄, 그것은 쉘에도 의존 할 수 있습니다. 이식성을 위해 예제에서는 대문자를 사용했지만 bash홈 디렉토리에서 실제로 [A-Z]는 "cdfhjmpqrt"로 확장됩니다. 따라서 대소 문자를 구분하지 않습니다.
manatwork

1
zshbash의 failglob옵션 은 말할 것도 없습니다 . 나는 개인적으로 일반적으로 (내 임시 파일 이름 ~) a, b, c... 그리고 내 임시 DIRS A, B, C...
스테판 Chazelas가

4

가장 유명한 명령은 stty로 사용할 수 있습니다 STTY. 를 사용하여 터미널을 정상적인 동작으로 다시 설정하는 것이 매우 편리했습니다 STTY SANE.


나는 /bin/stty다른 것이 없습니다. 답을 좀 더 정교하게 관리 하시겠습니까?
Emanuel Berg

2
좋은 옛날에는 터미널이 너무 엉망이되어 모든 것이 대문자였습니다. 따라서 입력 a하면 터미널이 나타납니다 A. 온전함을 복원하려면 stty sane명령을 사용하십시오 . 현재 불가능하다는 점을 제외하고 는 매우 환영받은 stty대로 사용할 수 STTY있었습니다. 나는 이것을 필요로했던 마지막 시간조차도 기억할 수 없다 :)
Dennis Kaarsemaker

@DennisKaarsemaker : 와우! 그것은 멋진 역사의 일부입니다!
Emanuel Berg

1
여러분 (ott-- 및 @DennisKaarmaker), 당신은 그것을 뒤로했습니다. 설명을 위해 다른 답변 을 게시했습니다 .
Stéphane Chazelas

4

역사적 답변 에 대한 몇 가지 참고 사항 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(소문자를 대문자로 출력) 도 필요합니다. 터미널로 보내기 전에 소문자를 대문자로 변환해야합니다.
  • 이제 VT50에서 유닉스를 운영 할 수 있지만 지금 대문자를 입력하려면 어떻게해야합니까? 여기에서 xcase 로컬 플래그가 나타납니다. 이렇게하면 (표준 입력 모드에서만) A을 입력하여 대문자를 보낼 수 있으며 \A출력에서는 대문자 A가로 렌더링됩니다 \A. (Linux에서는 구현되지 않았습니다)

stty명령은 해당 가지고 iuclc, olcuc그리고 xcase설정과 세에 대한 별칭 : lcase. 기본 설정과 이후 stty sane에 얻는 것은 lcase꺼져 있습니다.

따라서 VT50을 사용하는 경우 다음을 실행하면됩니다.

stty lcase

무엇이든 할 수 있습니다. 그러나 대문자 만 보낼 수있을 때 어떻게해야합니까? 이 곳에서에 STTY대한 별칭 으로 명령 이 필요한 곳이며에 대한 별칭으로 지원 되는 stty이유 입니다 .sttyLCASElcase

터미널이 모두 대문자 SANEstty sane때 원하지 않기 때문에 그러한 별칭 이 없습니다 .

일반 터미널에서 실수로 stty lcase또는 stty olcuc실수로 실행 하는 경우 ( xterm또는 최신 터미널 에서 시도 ), stty sane다시 정상으로 돌아 가기 위해 입력해야합니다 . 그러나 당신은 그것에 대한 STTY명령이 필요하지 않습니다 . 사용자가 입력하는 경우 stty sane, 당신은 것입니다 참조 STTY SANE다시 반향하지만 그것은 여전히입니다 만 번역 한 것입니다 표시된 텍스트 (안 입력 된 명령)입니다stty sane 실행됩니다 명령.

사람들은 iuclc, olcuc, xcase플래그는 POSIX에 의해 지정하는 데 사용 (그리고 리눅스에 구현 된 이유를 심각하게 사람이 이제까지) 재미보다 (다른 리눅스 시스템에 그 오래된 단말기의 연결 의심하더라도 그것은 아마) 만에 제거 된 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 개의 별개입니다.
Stéphane Chazelas

0

데비안에 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]*'
Stéphane Chazelas

@StephaneChazelas : 좋아, 검색 경로가 표시되고 쉘 기능도 포함됩니다. 그러나 광산은 또한 zsh에 따라 다릅니다. 소문자 $path는 bash에 없습니다. 정보가 많을수록 좋습니다.
Emanuel Berg

1
그렇습니다, 나는 당신의 잘못이라고 말하지 않았고 대안을 제안했습니다. 참고 $pathzsh을 특정하지 않습니다. 그것은 csh/tcsh당신의 명령이 작동하는 곳 에서 나옵니다 .
Stéphane Chazelas

@StephaneChazelas : 아하, 흥미 롭습니다! 아니요, 내 명령이 "잘못된"것은 아니지만 쉘 기능과 별칭을 포함하는 것이 합리적이므로 더 나은 방법에 동의합니다. 적어도 내 컴퓨터를 사용할 때 바이너리, 스크립트, 함수, 별칭 등을 실행할 수 있고 실행 가능한 한 신경 쓰지 않기 때문입니다. (나는 -m"일치"를위한 것 같아요 .)
Emanuel Berg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.