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

터미널이 모두 대문자 SANE일 stty 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.