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にあると仮定します)。
デロベルト

回答:


13

Unixではコマンド名に制限はありません。任意のファイルをコマンドにすることができます。また、ファイル名は、ASCII NULまたはASCII以外の文字の1つ以上(ただし上限)の任意のシーケンスにすることができます/zsh関数名として任意の文字列を使用できる関数の制限も解除されます。

ただし、いくつかの注意事項があります。

  • .or というコマンドファイルを作成するのに苦労します..;-)。
  • すでに標準のコマンドやシェル組み込みコマンドやキーワード(最も一般的なシェルの少なくとも等で撮影している回避名bashzshtcshまたはksh)。通常、標準のコマンドでは大文字は使用されないため、大文字が役立ちます。
  • ASCII文字に制限することをお勧めします。非ASCII文字は、そこにあるさまざまな文字セットで同じように表現されません
  • その間、文字、数字、ダッシュ、ドット、アンダースコアに制限してください。何か他のもの、法的ながら、これでまたはツールは、(例えば、という一つの問題または別のを引き起こす可能性があり|=&および他の多くは、あなたが使用している場合、シェルにエスケープする必要があるでしょう:、あなたのコマンドは、1つのログインシェルとして使用することはできません... )。あなたも除外することもできます.し、-ユーザーがシェル機能であなたのコマンドをラップできるようにしたい場合にはこれは、多くのシェル内の関数名に許可されていません。
  • 最初の文字を文字にします。繰り返しますが、厳密な要件ではありません。ただし、アンダースコアは特別なもの(zsh補完システムがで始まる関数など)に使用されることがあり_、全桁のコマンドがなどの問題になる可能性がありますcmd>output.log。名前がドットで始まるファイルは、lsシェルグロビングや多くのファイルマネージャーなどによって隠されます。

正しい。だから私はそれが要約すると推測する、あなたがそうする正当な理由がない限り、普通でないものを使わないでください。2番目のポイントでさえ、大文字を使用してそれらのシェルをカバーすることはそれほど賢いとは思いません。変更を説明するコマンドに名前を付けた方が良いと思いませんか?のような、zsh_with_some_funky_option(の代わりにZSH)?
エマニュエルベルク

エイリアスはコマンドですか?はい、私は非常に簡単に時間タイピングを持っていた場合のでalias .="echo Hello").-(まあ、sudo vim /bin/....)が、困難だった
アロイスMahdal

@AloisMahdalだから私はコマンドファイルを言った。zshも許可します.() echo Hello。pdkshも同様ですが、.特別な組み込みが優先されます。
ステファンシャゼル

おっと、私の誤読... pdkshの優先順位についての興味深い点は、しかし...
アロイス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

つまり、すべてのUbuntu 12.04で758です。全リスト:https : //gist.github.com/5264777


いやXdialog?:oそしてgrep、シェルが実行前に現在のディレクトリで展開するのを避けるために、パラメータを引用する必要があります。
マナトワーク

このシステムにインストールしないでください:)
デニスカースメーカー

2
私は引用grep

1
まあ、それもシェルに依存する可能性があります。移植性のために、この例では大文字を使用しましたが、bash私のホームディレクトリでは、実際[A-Z]には「cdfhjmpqrt」に費やしています。したがって、大文字と小文字は区別されません。
マナトワーク

1
言うまでもなくzsh、bashのfailglobオプション。私は個人的に、一般的(で私の一時ファイルに名前を付ける~abc...そして私の一時dirsにABC...
ステファンChazelas

4

最も有名なコマンドはstty、としても利用可能でしたSTTY。で端末を通常の動作に戻すのは非常に便利でしたSTTY SANE


私は持っていません/bin/sttyが、何も。回答を少し詳しく説明してください。
エマニュエルベルク

2
古き良き時代には、端末がめちゃくちゃになり、すべてが大文字になることがありました。入力するaと、端末に表示されAます。正気を回復するには、stty sane次のコマンドを使用します。これが今不可能であることを除けば、非常に歓迎sttyされSTTYたように利用可能です。私はこれが必要だった最後の時間を思い出すことさえできません:)
デニスカースメーカー

@DennisKaarsemaker:すごいそれは歴史の一部です!
エマニュエルベルク

1
みんな(ott--と@DennisKaarsemaker)、あなたはそれを後方に持っています。説明のために別の回答を投稿しました。
ステファンシャゼル

4

歴史的なSTTYコマンドに関するいくつかのメモは、他の回答と関連するコメントの

DEC VT05などの以前の端末 VT50のとその前のテレプリンターは大文字のみをサポートしていました。これは、小文字を入力できないこと、または大文字以外の文字を表示できないことを意味します。

Unixでは大文字と小文字が区別され、ほとんどのコマンドは小文字であるため、問題があることがわかります。そのため、これらを処理する特別なtermio / termiosモードがあります(そして、それらの端末がなくなったとしても、現代のUnicesにはまだあります)。

termio / termiosは、それぞれUnixのttyドライバーを制御するための古いインターフェイスと新しいインターフェイスです。termio(s)ioctlでは、入力、出力、制御フラグ...を指定します。これは、シリアルライン上の電気信号を入力および出力文字に処理する方法と、エコーなどのドライバーの内部動作を指定します。ラインエディタ...それらのほとんどは、最新のUnix VGAコンソールや擬似端末などの仮想端末に適用されます。

コマンドラインインターフェイスtermio(s)sttyコマンドです。

大文字の端末を処理するには、3つのtermio(s)フラグが関係します。

  • IUCLC(大文字から小文字への入力):入力文字は、入力時に小文字に変換されます。つまりA、端末から送信されたがと見なされますa。つまり、これをオンにするとLS、VT50を入力できるようになり、シェルはlsから読み取ります/dev/ttyXsttyコマンドを実行することもできます。
  • ここで、IUCLCaloneとterminalを使用するとecho、入力中にLS、ドライバーはls表示できないターミナルに返送されるので(入力内容を確認できます)、OLCUC(小文字を大文字に出力)、つまり端末に送信する前に、小文字を大文字に変換する必要があります。
  • さて、VT50からUnixを操作できますが、今大文字を入力したい場合はどうでしょうか?ところだxcase ローカルフラグに入っています。これは、上ケースを送信する(カノニカル入力モードのみで)可能Aタイピングによって\A、および出力に、上部ケースはAとしてレンダリングされます\A。(Linuxには実装されていません)

このsttyコマンドには、対応するiuclcolcucおよびxcase設定と3つすべてのエイリアスがありますlcase。デフォルト設定と取得後の設定stty sanelcaseオフです。

したがって、VT50を使用している場合、実行する必要があるのは次のコマンドのみです。

stty lcase

何でもできるように。ちょっと待ってください、大文字しか送信できない場合はどうしますか?のSTTYエイリアスとしてコマンドが必要な場所です。そのためstty、のエイリアスとしてsttyサポートLCASEしていlcaseます。

端末がすべて大文字の場合SANEは実行stty saneしたくないため、このようなエイリアスはありません。

通常の端末で実行するstty lcasestty olcuc、誤って実行した場合(それを試してみるxtermか、最新の端末)、そこstty saneに戻って通常に戻ります。ただしSTTY、そのためのコマンドは必要ありません。あなたが入力した場合stty sane、あなたがします参照STTY SANEエコーバックを、それが翻訳されていますのみ表示されたテキスト(いない入力されたコマンド)ですが、それはまだですstty sane実行されるコマンド。

これらのiuclcolcucxcaseフラグはPOSIXによって指定されるように使用され(それがLinux上で実装されている理由は、私は真剣に誰もがこれまでの楽しみのため以外のLinuxシステム()にそれらの古い端末のいずれかを接続疑うにもかかわらず、おそらくだ)が、中に削除されました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の異なるもの。
ステファンシャゼル

0

Debian sid、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

編集:上記のコマンドでは、文字ではなく数字の1であることに注意してくださいl。1列に1つ。


1
zsh実行:type -m '*[A-Z]*'
ステファンChazelas

@StephaneChazelas:OK、検索パスが表示され、シェル関数も含まれます。しかし、私のものはzsh特有でもあります:小文字$pathは一度もbashにありません。まあ、情報が多ければ多いほど良いです。
エマニュエルベルク

1
はい、あなたが間違っているとは言いませんでしたが、代替案を提案しただけです(言い回しのベストではなかったことに同意します)。これ$pathはzsh固有ではないことに注意してください。それはcsh/tcshあなたのコマンドが機能する場所から来ます。
ステファンシャゼル

@StephaneChazelas:ああ、それは面白い!いいえ、私のコマンドは「間違った」ものではありませんが、シェル関数とエイリアスを含めるのが理にかなっているので、あなたの方が良いことに同意します。少なくとも私にとっては、コンピューターを使用するとき、バイナリー、スクリプト、関数、エイリアス、その他何でも構いません。(私-mは「マッチ」のためだと思います。)
エマニュエルベルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.