Qiitaの19日目です。zsh無しにbashで生きるzsh大好きな皆さんは、bashを心の中のどこかでバカにしているのではないでしょうか。最近のbashは、いろいろとzshを意識している(?)雰囲気があり、zsh特有だと思っていた機能が実はbashでも使えたりします。そのため、zshを使えないと全身から血を吹き出して死ぬログインシェルとしてzshが起動されないと発狂して死ぬ「最近はSolarisにだってzshが入っている」と一日100回は唱えないと死ぬzsh神社が欲しい、参拝したいという人でも、bashがあれば多少の延命ができるかもしれません。本稿では、zshが無いというサバイバル環境下において、bashでなんとかすることをテーマにいくつかサンプルを挙げてみます。ここでは、bashのプロンプトを$、zshのプロンプトを%として表記します。zshの%は、「宇宙」を意味しています。zshは宇宙だからです。Completionzshでpingを打つときには、ホスト名を/etc/hostsに書いておけばTabキーで補完できます。<嬉しい!>一方bashでは、先頭に@が付いている場合のみTabキーによるホスト名の補完が効きます。そのためsshの時は良いのですが、pingでは補完されません。<Shit!>「だからbashはダメだ」と鍛えられたzsh使いは思うことでしょう。Completion)という機能でzshと同様に補完できるのです。プログラム補完を有効にするプログラム補完は、機能自体はbashに組み込まれていますが、設定ファイルを別途用意する必要があります。6では、これら設定ファイルはbash-completionというパッケージに用意されています。このbash-completionパッケージはCentOS公式リポジトリには無く、EPELにしか用意されていません。そのため必要な場合にはEPELリポジトリから別途インストールする必要があります。7ならば、公式のbaseリポジトリに用意されています。6/7のどちらにしろ、bash-completeパッケージをyumコマンドでインストールするだけで準備完了です。bash-complete現在の補完設定を確認するbashのビルトインコマンドであるcompleteを引数無しで実行すると、現在設定されている補完リストが表示されます。alternatives......例えば、pingコマンドに対しては以下のように定義されています。pingプログラム補完は、ping以外にも様々なコマンドに対応しています。sysctlのクソ長い記述も、Tabで補完できます。Flood攻撃の際に重要となる、net.ipv4.tcp_synack_retriesを補完してみましょう。5またopensslコマンドのような、増築に増築を重ね続けてそびえ立つクソ複雑なコマンドも、うろ覚えで利用できます。-setalias.........他にも、そんなもん誰が使うんだって感じですが、iptablesのチェイン名なども補完できます。<別に嬉しくない!>興味のある方は、/etc/bash_completion.dの中を覗いてみましょう。プログラム補完の設定自体はシェルスクリプトで書かれているので、なんとなくオーラで分かると思います。globstarzshでよく使われるのが、**というパス名展開です。あるディレクトリ配下のファイルを根こそぎ相手にしたいときに役に立ちます。**/*.javaこれはbashでも、shoptコマンドでglobstarというオプションを設定してやることで利用できます。**/*.javaこれで、「書いたJavaソースファイルの行数(だけ)で進捗を測る」というクソ環境でも安心です。コメント行とimport文をモリモリ増やしましょう。autocdzshユーザは忙しいので(もちろん~/.zshrcのカスタマイズに忙しいのです)、「cd」の2文字すら打つのを嫌がります。そのため、cdコマンドを省略できるauto_cdを設定している人が多くいます。pwd/binこれは、忙しいbashユーザ(もちろん~/.bashrcのカスタマイズに忙しいのです)も利用できます。zshと同様に、autocdというオプションをshoptコマンドで設定できます。bin」を表示してくれるので、zshよりも若干フレンドリーです。大文字小文字を無視して補完するzshユーザは余計な暗記をしたくないので(zshの機能を覚えたいので)、ファイル名の記憶が常におぼろげで曖昧です。そのため、大文字小文字を無視して補完してくれる以下のような設定を、~/.zshrcに書いておくことが好まれます。これで大文字小文字を無視して、Tabキーで補完できます。'm:{a-z}={A-Z}'一方bashでは、事情がちょっぴり複雑です。現在のbashには、zshと同様に大文字小文字を無視して補完させる明示的なオプションはありません。~/.inputrcに以下のように書いておくことで、bashでも大文字小文字を無視してTabキーで補完することができます。onしかし、~/.inputrcはreadlineの設定ファイルであり、bashのみから使われるわけではないので、若干気持ち悪いです。副作用に気をつけましょう。さんから教えてもらいましたが、次のように~/.inputrcファイル内でif文を使うことで、設定をbashのみに限定できます。Constructs」辺りを読みましょう。そのまま書くとreadlineを使うコマンド全てに影響があるので、例えばftpでも大文字小文字補完が効くようになります。言って困ることはあまりないでしょうが、やはりif文を使ってbash限定にしておいた方が好ましいでしょう。nocaseglobはちょっと違うbashのnocaseglobというオプションをshoptコマンドで設定すると、大文字小文字を無視してパス名展開されるようになります。これは、Tabキー補完はできません。この点、時々勘違いして書かれている文書があるので注意が必要です。<大文字小文字無視してパス名展開された!>このようにnocaseglobは、あくまでパス名展開のみの機能です。終わりにここで紹介した以外にも、最近のbashには様々な機能が追加されています。全身から血を吹き出して死ぬ前に、bashのmanを熟読してみると良いかもしれません。ちなみに私はzshの補完のヌルヌル感が苦手で、zshはあまり使っていません。最後に宣伝6月にシェルスクリプトの本を出しましたが、このたびKindle版も出ました。興味のある方はポチっとして頂けると、私も全身から血を吹き出さずに済みます。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。