bashでgit comまでタイプしてタブキーを打つとcommitと補完される謎を追う
ひっそりぃはUbuntu Linux 13.04を使っているのですが、git commitしようとして、何気なくgit comまでタイプしCtrl-i(タブキー)を押すと、なんとcommitと補完され驚きました。
シェルはbashを使っているので、コマンド名やディレクトリ名が補完されるのは当然なのですが、コマンドの引数まで補完されるとは。
bashにこんな機能あったっけ?
と気になったので調べてみた。
調査にはプロセスのsystem callやsignalをtraceできるstraceコマンドを使います。全てのtraceを追うと大変そうなので、補完のためのデータベースを読みに行くのでは?とあたりをつけ、open()のみ追うことにします。
コマンドは、以下の様になります。
bashが起動する過程でのopen()結果がずらずらと表示され、以下の状態で止まりました。
ここで、キーボードにて「git com」までタイプし、おもむろにタブキーをたたくと、
シェルはbashを使っているので、コマンド名やディレクトリ名が補完されるのは当然なのですが、コマンドの引数まで補完されるとは。
bashにこんな機能あったっけ?
と気になったので調べてみた。
調査にはプロセスのsystem callやsignalをtraceできるstraceコマンドを使います。全てのtraceを追うと大変そうなので、補完のためのデータベースを読みに行くのでは?とあたりをつけ、open()のみ追うことにします。
コマンドは、以下の様になります。
$ strace -e open bash
bashが起動する過程でのopen()結果がずらずらと表示され、以下の状態で止まりました。
: (省略)
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
open("/etc/bash_completion.d/zeitgeist-daemon", O_RDONLY|O_LARGEFILE) = 3
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
open("/home/hissorii/.bash_history", O_RDONLY|O_LARGEFILE) = 3
open("/home/hissorii/.bash_history", O_RDONLY|O_LARGEFILE) = 3
open("/lib/terminfo/s/screen", O_RDONLY|O_LARGEFILE) = 3
open("/etc/inputrc", O_RDONLY|O_LARGEFILE) = 3
hissorii@ubuntu:~$
ここで、キーボードにて「git com」までタイプし、おもむろにタブキーをたたくと、
スポンサーサイト
ハッとしてGit
今まで我が家のWeb/ファイル/VPN/svnサーバー等に大活躍だった玄箱くんですが、HDDが200GBでそろそろ限界だったのでリプレースしてみた。buffaloのNAS、LS-V500LのHDDを2.5TBに換装し、debianをインストール。
とりあえずsubversionのサーバーも設定してみたりしたが、最近よく聞くGitなるものも気になる今日この頃。
必要に迫られrcs, cvs, svnと渡り歩いて来たわけだが、今さらながらGitについてちょっと調べてみる。流行に疎くてすみません。
なるほど、ローカルにcommitして、リモートにpushとかpullとか。リポジトリを分散管理できるわけか。
リポジトリのバックアップにも便利そうだし、ソース公開するときにはGitHubのような公開サーバーにリポジトリ作ってpushすれば楽だね。今までみたいにソース公開毎にアーカイブ作る手間が省けるな。
多人数での開発でなくても結構メリットはありそうですね。
とりあえずNASのdebianくんにローカルなリモートリポジトリを作るか。ローカルのリモートという語感もちょっと違和感ありますが。
Gitの基本パッケージは既にインストールされているようで、git-daemon-runというパッケージを追加インストール。
これでいいのかな?
とりあえずgitのportはlisten状態になっているので大丈夫っぽい。
ところでgitのportって何番やねん。
うーむ、http proxy経由でも抜けられるような手段はあるのかな。
とりあえず使いながら慣れてみますか。
とりあえずsubversionのサーバーも設定してみたりしたが、最近よく聞くGitなるものも気になる今日この頃。
必要に迫られrcs, cvs, svnと渡り歩いて来たわけだが、今さらながらGitについてちょっと調べてみる。流行に疎くてすみません。
なるほど、ローカルにcommitして、リモートにpushとかpullとか。リポジトリを分散管理できるわけか。
リポジトリのバックアップにも便利そうだし、ソース公開するときにはGitHubのような公開サーバーにリポジトリ作ってpushすれば楽だね。今までみたいにソース公開毎にアーカイブ作る手間が省けるな。
多人数での開発でなくても結構メリットはありそうですね。
とりあえずNASのdebianくんにローカルなリモートリポジトリを作るか。ローカルのリモートという語感もちょっと違和感ありますが。
Gitの基本パッケージは既にインストールされているようで、git-daemon-runというパッケージを追加インストール。
これでいいのかな?
とりあえずgitのportはlisten状態になっているので大丈夫っぽい。
hissorii@debian:/etc$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:microsoft-ds *:* LISTEN
tcp 0 0 *:git *:* LISTEN
tcp 0 0 *:netbios-ssn *:* LISTEN
tcp 0 0 *:www *:* LISTEN
udp 0 0 192.168.1.203:ntp *:*
udp 0 0 localhost:ntp *:*
udp 0 0 *:ntp *:*
udp 0 0 192.168.1.25:netbios-ns *:*
udp 0 0 192.168.1.20:netbios-ns *:*
udp 0 0 *:netbios-ns *:*
udp 0 0 192.168.1.2:netbios-dgm *:*
udp 0 0 192.168.1.2:netbios-dgm *:*
udp 0 0 *:netbios-dgm *:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 28637 /var/run/apache2/cgisock.2327
unix 2 [ ACC ] STREAM LISTENING 1201 /var/run/dbus/system_bus_socket
hissorii@debian:/etc$
ところでgitのportって何番やねん。
hissorii@debian:/etc$ grep Git /etc/services
git 9418/tcp # Git Version Control System
hissorii@debian:/etc$
うーむ、http proxy経由でも抜けられるような手段はあるのかな。
とりあえず使いながら慣れてみますか。