コマンドラインシェル

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

Wikipedia より:

Unix シェルは、UNIX オペレーティングシステムおよび Unix 系システムの従来からのユーザインタフェースを提供するコマンドラインインタプリタまたはシェルである。コマンドラインインタプリタに文字列の形でコマンドを入力することでコンピュータを直接操作したり、そのようなコマンドを並べたスクリプトを書いて実行させたりするのに使われる。

シェル一覧

POSIX に(多かれ少なかれ)準拠しているシェルは #POSIX準拠 に、異なる構文を持つシェルは #代替シェル にリストアップされています。

POSIX準拠

これらのシェルはすべて /usr/bin/sh からリンクできます。BashmkshAURzsh、 を sh という名前で呼び出すと、自動的に POSIX に準拠するようになります。

  • Bash — Bash は Bourne シェルを拡張したもので、コマンドライン履歴と補完、インデックス付き連想配列、整数演算、プロセス置換、ヒア文字列、正規表現マッチング、およびブレース展開などの機能を備えています。
https://www.gnu.org/software/bash/ || bash
  • DASH — 可能な限り小さくなるように作られた POSIX 互換の /bin/sh の実装です。なるべく速度を犠牲にしないように作られています。実際に、ほとんどの処理で Bash (GNU Bourne-Again SHell) よりも高速に動きます。
http://gondor.apana.org.au/~herbert/dash/ || dash
  • 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 || 記事を参照
  • nsh — Fish のようなコマンドラインシェルですが、POSIX と互換性があります。
https://github.com/nuta/nsh || nsh-gitAUR
  • OSH (Oil Shell) — Oil Shell は Bash 互換の UNIX コマンドラインシェルです。OSH は GNU/Linux を含むほとんどの UNIX ライクなオペレーティングシステムで実行できます。Python (v2.7) で記述されていますが、ネイティブの実行可能ファイルが付属しています。OSH によって認識される Bash の方言は OSH 言語と呼ばれます。
https://www.oilshell.org || oshAUR
  • Yash — C99 (ISO/IEC 9899:1999) で書かれた POSIX に準拠したコマンドラインシェルです。Yash は世界で最も POSIX に準拠したシェルであることを意図しており、日常的な対話やスクリプトによる使用のための機能をサポートしています。
https://yash.osdn.jp || yashAUR
  • Zsh — インタラクティブな利用のために作られたシェルですが、パワフルなスクリプト言語でもあります。Bash, ksh, tcsh の便利な機能の多くが Zsh に組み入れられており、オリジナルの機能も多数追加されています。入門ドキュメント に Zsh のユニークな機能の説明があります。
http://www.zsh.org/ || zsh
ヒント: POSIX と Bash スクリプトは shellcheck を使ってリント (構文チェックやコード解析) できます。

代替シェル

  • C shell — 対話式のログインシェルとしてもシェル言語コマンドプロセッサとしても使うことができるコマンド言語インタプリタ。コマンドラインエディタ、プログラマブルな単語補完、スペル訂正、履歴機構、ジョブ操作、C ライクな構文を持っています。
http://www.tcsh.org || tcsh
  • Closh — Clojure に基づく Bash のようなシェル。
https://github.com/dundalek/closh || closhAUR
  • Elvish — 近代的かつ表現豊かなシェルで、内部構造の値をパイプラインで渡すことができます。この機能によって複雑なテキスト処理のコードを書かなくてすみます。表現的なプログラミング言語を備えており、例外・名前空間・匿名関数などが使えます。タイピング中に構文をチェックする強力な readline を装備しており、デフォルトでシンタックスハイライトが効きます。
https://elvish.io || elvishAUR
  • fish — スマートでユーザーフレンドリなコマンドラインシェル。OS X や Linux などに対応。Fish にはフルカラーのコマンドライン・シンタックスハイライトがあり、コマンドとその引数、既存のファイルや履歴のハイライトそして補完をすることができます。履歴やコマンドの補完候補の表示もサポート。Fish はシステムの man ページを解析してコマンドの正しい引数を調べることにより、コマンドのハイライトと補完を可能にしています。Alt-Up を使うことで最後に実行したコマンドの変更を簡単に行うことができます。fish デーモン (fishd) は fish の全てのインスタンス間で、履歴や環境変数を同期します。
http://fishshell.com/ || fish
  • ion — Ion は、シンプルかつ強力な構文を特徴とする、最新のシステムシェルです。シェル全体の品質と安全性を大幅に向上させ、ShellShock のような脆弱性の可能性を排除し、開発を容易にするために、すべて Rust で書かれています。また、Ion の機能を活用した場合、Dash を超えるレベルのパフォーマンスを発揮します。主に RedoxOS と並行して開発されていますが、他の *nix プラットフォームでも十分な性能を発揮します。詳しくは マニュアル を参照して下さい。
https://gitlab.redox-os.org/redox-os/ion/ || ion-gitAUR
  • Murex — 機能が改善され、UX が強化されたコマンドラインシェル。
https://murex.rocks/ || murexAUR
  • nushell — Nu は、関数型プログラミング言語や最新の CLI ツールからインスピレーションを受けています。ファイルやサービスを生のテキストの流れとして考えるのではなく、Nuはそれぞれの入力を構造化されたものとして見ます。
https://www.nushell.sh || nushell
  • Oh — Go で書かれた Unix シェル。他の Unix シェルと同じような精神を持っていますが細かい所は異なっています。Oh はシェルの対話機能を犠牲にすることなくシェルのプログラミング言語機能を拡張しています。
https://github.com/michaelmacinnis/oh || oh-gitAUR
  • Powershell — PowerShell は元は Windows 専用に作られた、オブジェクト指向言語でありインタラクティブなコマンドラインシェルです。後になって、オープンソース化されて macOS や Linux に移植されました。
https://github.com/PowerShell/PowerShell || powershellAUR
  • rc — Plan 9 のコマンドインタプリタで UNIX の Bourne シェルと同じような機能を提供します。細かい追加がなされ構文はもっと一般的になっています。
http://plan9.bell-labs.com/sys/doc/rc.html || 9base
  • xonsh — python インタプリタがベースの後方互換なシェル。
http://xon.sh/ || xonsh

デフォルトシェルを変更する

上記のシェルをインストールした後、実行ファイルを起動すると、今使っているシェルの中でインストールしたシェルが起動します。ログイン時にインストールしたシェルが起動するようにしたい場合、デフォルトシェルを変更する必要があります。

インストールされているシェルを確認するには、次を実行:

$ chsh -l

デフォルトシェルを設定するには次を実行 (chsh -l で確認できる、フルパスを指定するようにしてください):

$ chsh -s full-path-to-shell

systemd-homed を使用している場合は、次のように実行します:

$ homectl update --shell=full-path-to-shell user

ここで、full-path-to-shellchsh -l で与えられたフルパスです。

上記コマンドを実行してからログアウト・ログインすると、指定したシェルが開くはずです。

ヒント: chsh は参照として /etc/shells を使用します。最近インストールしたシェルがリストにない場合は、このファイルに手動で追加できます。

シェルのアンインストール

警告: 以下の手順を踏まないと、ユーザがシェルにアクセスできなくなる可能性があります

シェルのパッケージを削除する前に、デフォルトのシェルを変更する 必要があります。

または、ユーザデータベース を変更します。

ログインシェルとして zsh が設定されている全てのユーザー (必要であれば root も含む) にこれを使用します。完了したら、パッケージを削除することができます。

ログインシェル

ログインシェルは呼び出しモードで、シェルはシステム全体の /etc/profile またはユーザー専用の ~/.profile や他のシェル固有のファイルなど、一度だけの初期化を目的としたファイルを読み込みます。これらのファイルは初期環境を設定し、シェル(他の非ログインシェルやグラフィカルプログラムを含む)から起動される他のすべてのプロセスに継承されます。例えば、ユーザがコンソールや SSH 経由でログインしたとき、--login パラメータを使って sudosu でユーザを変更したとき、ユーザが手動でログインシェルを起動したとき 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 thisrelated repository を参照してください。

入出力

GregsWikiI/O Redirection を参照。

  • リダイレクトは、コマンドが実行される前にファイルを切りすてます:
    $ command file > file
    したがって、期待通りには動作しません。一部のコマンド(例えばsed)は、ファイルをその場で編集するオプションを提供しますが、多くの場合は提供されません。このような場合は、moreutils パッケージの sponge(1) コマンドを使用します。
  • cat はシェルに組み込まれていないため、多くの場合、スクリプトやパフォーマンスを重視する場合は リダイレクト を使った方が便利です。実際、< filecat file と同じです。
  • シェルパイプラインは、デフォルトでは stdout で動作します。stderr(3) で動作させるには、command 2>&1 |othercommand のように strerr から strout に リダイレクトします。Bash 4 の場合は、command |& othercommand となります。
  • 多くの GNU Core Utilities はファイルを引数として受けとる事を思いだしてください。例えば、grep pattern < filegrep pattern file と置きかえられます。

参照