コマンドラインシェル
関連記事
Wikipedia より:
- Unix シェルは、UNIX オペレーティングシステムおよび Unix 系システムの従来からのユーザインタフェースを提供するコマンドラインインタプリタまたはシェルである。コマンドラインインタプリタに文字列の形でコマンドを入力することでコンピュータを直接操作したり、そのようなコマンドを並べたスクリプトを書いて実行させたりするのに使われる。
目次
シェル一覧
POSIX に(多かれ少なかれ)準拠しているシェルは #POSIX準拠 に、異なる構文を持つシェルは #代替シェル にリストアップされています。
シェル | 補完 & 履歴 | POSIX 準拠 |
---|---|---|
Bash | Yes | Yes (--posix )
|
C shell | Yes | No |
DASH | No | Yes |
fish | Yes | No |
mksh | Yes | Yes (-o posix )
|
rc | No | No |
zsh | Yes | Yes (--emulate sh )
|
POSIX準拠
これらのシェルはすべて /usr/bin/sh
からリンクできます。Bash、 mkshAUR、 zsh、 を sh
という名前で呼び出すと、自動的に POSIX に準拠するようになります。
- Bash — GNU のオペレーティングシステムで使われるシェル、もしくはコマンド言語インタプリタ。Bash は Korn shell (ksh) や C shell (csh) から便利な機能を集めた sh 互換のシェルです。IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools 標準を満たすことを目的にしています。プログラミングとインタラクティブ、両面で sh よりも機能的な改善がなされています。さらに、Bash では sh スクリプトのほとんどを修正を加えずに動かすことが可能です。
- DASH — 可能な限り小さくなるように作られた POSIX 互換の
/bin/sh
の実装です。なるべく速度を犠牲にしないように作られています。実際に、ほとんどの処理で Bash (GNU Bourne-Again SHell) よりも高速に動きます。
- Korn shell — KornShell 言語は AT&T ベル研究所の David G. Korn によって設計・開発されました。様々なコンピューター・ワークステーションから UNIX などのシステムにアクセスすることができるインタラクティブなコマンド言語です。また、KornShell 言語はアプリケーションを書くのに使える完全でパワフルな高級プログラミング言語でもあり、多くの場合、他の高級言語よりも簡単で高速です。このため特にプロトタイピングに適しています。他に広く使われているシェルとして、AT&T ベル研究所の Steven Bourne によって開発された Bourne シェルと、カリフォルニア大学の Bill Joy によって開発された C シェルという2つのシェルがあります。ksh はその2つのシェルの一番良い所を取り、新しい機能を数多く追加しました。そのため、システムとの対話とプログラミングの両方で ksh はあなたの作業の生産性と質を高めることができます。ksh のプログラムは簡単に書くことができ、C などの低級言語で書かれたプログラムよりも簡潔で読みやすいものになります。
- http://www.kornshell.com || 記事を参照
- Zsh — インタラクティブな利用のために作られたシェルですが、パワフルなスクリプト言語でもあります。Bash, ksh, tcsh の便利な機能の多くが Zsh に組み入れられており、オリジナルの機能も多数追加されています。入門ドキュメント に Zsh のユニークな機能の説明があります。
代替シェル
- C shell — 対話式のログインシェルとしてもシェル言語コマンドプロセッサとしても使うことが出来るコマンド言語インタプリタ。コマンドラインエディタ、プログラマブルな単語補完、スペル訂正、履歴機構、ジョブ操作、C ライクな構文を持っています。
- Elvish — 近代的かつ表現豊かなシェルで、内部構造の値をパイプラインで渡すことができます。この機能によって複雑なテキスト処理のコードを書かなくてすみます。表現的なプログラミング言語を備えており、例外・名前空間・匿名関数などが使えます。タイピング中に構文をチェックする強力な readline を装備しており、デフォルトでシンタックスハイライトが効きます。
- https://elvish.io || elvishAUR
- fish — スマートでユーザーフレンドリなコマンドラインシェル。OS X や Linux などに対応。Fish にはフルカラーのコマンドライン・シンタックスハイライトがあり、コマンドとその引数、既存のファイルや履歴のハイライトそして補完をすることができます。履歴やコマンドの補完候補の表示もサポート。Fish はシステムの man ページを解析してコマンドの正しい引数を調べることにより、コマンドのハイライトと補完を可能にしています。Alt-Up を使うことで最後に実行したコマンドの変更を簡単に行うことが出来ます。fish デーモン (fishd) は fish の全てのインスタンス間で、履歴や環境変数を同期します。
- Nash — Plan 9 の rc の影響を受けているシステムシェル。オペレーティングシステム (Linux や Plan 9) の名前空間を活用して読みやすく安全なスクリプトを簡単に作成できます。
- Oh — Go で書かれた Unix シェル。他の Unix シェルと同じような精神を持っていますが細かい所は異なっています。Oh はシェルの対話機能を犠牲にすることなくシェルのプログラミング言語機能を拡張しています。
- Powershell — PowerShell は元は Windows 専用に作られた、オブジェクト指向言語でありインタラクティブなコマンドラインシェルです。後になって、オープンソース化されて macOS や Linux に移植されました。
- rc — Plan 9 のコマンドインタプリタで UNIX の Bourne シェルと同じような機能を提供します。細かい追加がなされ構文はもっと一般的になっています。
- xonsh — python インタプリタがベースの後方互換なシェル。
デフォルトシェルを変更する
上記のシェルをインストールした後、実行ファイルを起動すると、今使っているシェルの中でインストールしたシェルが起動します。ログイン時にインストールしたシェルが起動するようにしたい場合、デフォルトシェルを変更する必要があります。
インストールされているシェルを確認するには、次を実行:
$ chsh -l
デフォルトシェルを設定するには次を実行 (chsh -l
で確認できる、フルパスを指定するようにしてください):
$ chsh -s full-path-to-shell
上記コマンドを実行してからログアウト・ログインすると、指定したシェルが開くはずです。
ログインシェル
ログインシェルは呼び出しモードで、シェルはシステム全体の /etc/profile
またはユーザー専用の ~/.profile
や他のシェル固有のファイルなど、一度だけの初期化を目的としたファイルを読み込みます。これらのファイルは初期環境を設定し、シェル(他の非ログインシェルやグラフィカルプログラムを含む)から起動される他のすべてのプロセスに継承されます。例えば、ユーザがコンソールや SSH 経由でログインしたとき、--login
パラメータを使って sudo や su でユーザを変更したとき、ユーザが手動でログインシェルを起動したとき bash --login
) などです。
さまざまな初期化ファイルの概要については、#設定ファイル とその中のリンクを参照してください。ログインシェルの詳細については、Stackexchange の Difference between Login Shell and Non-Login Shell? や Why a "login" shell over a "non-login" shell? を参照してください。
設定ファイル
ログイン時にコンソールでプログラムを自動起動させたい場合、シェルのスタートアップファイル・ディレクトリを使用することができます。シェルのドキュメントや ArchWiki の記事を見てください (例: Bash#設定ファイルや Zsh#設定ファイル)。
Wikipedia:Unix shell#Configuration files も参照。
/etc/profile
ログイン時に Bourne 互換のシェルは /etc/profile
を読み込み、それから /etc/profile.d/
の *.sh
ファイルを全て読み込みます。これらのスクリプトはインタプリタのディレクティブを必要とせず、実行可能属性を付与する必要もありません。環境やアプリケーション個別の設定を定義するのに使用します。
標準化
(いくつかの)シェルの設定ファイルを同じ命名規則に従うようにしたり、シェル間で共通の設定をサポートする事ができます。
the article about this や related repository を参照してください。
入出力
GregsWiki と I/O Redirection を参照。
- リダイレクトは、コマンドが実行される前にファイルを切りすてます:
command file > file
したがって、期待通りには動作しません。一部のコマンド(例えばsed)は、ファイルをその場で編集するオプションを提供しますが、多くの場合は提供されません。このような場合は、moreutils パッケージの sponge(1) コマンドを使用します。
- cat はシェルに組み込まれていないため、多くの場合、スクリプトやパフォーマンスを重視する場合は リダイレクト を使った方が便利です。実際、
< file
はcat file
と同じです。
- POSIX準拠のシェルは ヒアドキュメント をサポートしています:
$ cat << EOF one two three EOF
- シェルパイプラインは、デフォルトでは stdout で動作します。stderr(3) で動作させるには、
command 2>&1 |othercommand
のように strerr から strout に リダイレクトします。Bash 4 の場合は、command |& othercommand
となります。
- 多くの GNU Core Utilities はファイルを引数として受けとる事を思いだしてください。例えば、
grep pattern < file
はgrep pattern file
と置きかえられます。
参照
- IBM developerWorks の Linux におけるシェルの進化
- terminal.sexy — ターミナルカラースキームデザイナ
- Hyperpolyglot — シェル構文の比較
- UNIX Power Tools — 一般的なコマンドラインツールの使用方法
- commandlinefu.com — コマンドラインスニペットの共有
- アプリケーション一覧/ユーティリティ#ターミナルエミュレータ