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"로 확장됩니다. 따라서 대소 문자를 구분하지 않습니다.
zsh
bash의 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
이유 입니다 .stty
LCASE
lcase
터미널이 모두 대문자 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에 없습니다. 정보가 많을수록 좋습니다.
$path
zsh을 특정하지 않습니다. 그것은 csh/tcsh
당신의 명령이 작동하는 곳 에서 나옵니다 .
-m
"일치"를위한 것 같아요 .)