2012-04-08 9 views
4

私はエイリアスや機能を意味するものではありません。私は実際にbashソースコードに新しい内部コマンド全体を追加したいと考えています。内部コマンドをbashに追加するにはどうすればよいですか?

私はそれをコンパイルすると、シェル自体に新しいコマンドが組み込まれています。

これにはどのような手順がありますか?

+0

この質問はしばらくここにいましたが、あなたは '-f'可能考えるかもしれません。この機能が最近追加されたかどうかはわかりません。 – sjsam

答えて

6

これは実際a more specific questionに対する答えの一部として上がった(変数に評価さPS1出力を取得する方法)と私はbashソースコードを変更するプロセスに1より一般的な、プロセスは、独自の質問と答えに値すると思いました。

ここでは、内部コマンドevalps1を追加する手順を示します。これは、プライマリプロンプト文字列と同じ出力を提供するためのものです。バージョン4.2コードベースに基づいています。

ステップ1.

まず、あなたが「本物」bashと混同しないようにsupport/mkversion.shを変更し、そうFSFは、単に1を変更:-)保証の目的のために、すべての知識を否定することができライン(私は-paxビットを追加):

echo "#define DISTVERSION \"${float_dist}-pax\"" 

スクリプトはversion.hを作成しbashからバージョン情報を取得するすべての様々な方法に影響を与えるものであること:変数など。

ステップ2:

変更builtins/Makefile.inミックスに新しいソースファイルを追加します。これにはいくつかのステップが必要です。

(a)DEFSRCの末尾に$(srcdir)/evalps1.defを追加します。このdefファイルには、内部コマンドと実装コードに関する情報が含まれています。

(b)evalps1.oOFILESの末尾に追加します。これにより、単にコードがbashにリンクされます。

(c)に必要な依存関係を追加します。

evalps1.o: evalps1.def $(topdir)/bashtypes.h $(topdir)/config.h \ 
      $(topdir)/bashintl.h $(topdir)/shell.h common.h 

ステップ3:

builtins/evalps1.defファイル自体を追加し、これはあなたがevalps1コマンドを実行したときに実行されますコードです:

This file is evalps1.def, from which is created evalps1.c. 
It implements the builtin "evalps1" in Bash. 

Copyright (C) 1987-2009 Free Software Foundation, Inc. 

This file is part of GNU Bash, the Bourne Again SHell. 

Bash is free software: you can redistribute it and/or modify 
it under the terms of the GNU General Public License as published by 
the Free Software Foundation, either version 3 of the License, or 
(at your option) any later version. 

Bash is distributed in the hope that it will be useful, 
but WITHOUT ANY WARRANTY; without even the implied warranty of 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
GNU General Public License for more details. 

You should have received a copy of the GNU General Public License 
along with Bash. If not, see <http://www.gnu.org/licenses/>. 

$PRODUCES evalps1.c 

$BUILTIN evalps1 
$FUNCTION evalps1_builtin 
$SHORT_DOC evalps1 
Outputs the fully interpreted PS1 prompt. 

Outputs the PS1 prompt, fully evaluated, for whatever nefarious purposes 
you require. 
$END 

それはGPLライセンスです(から変更したので)シェル自身が使用するのと同じ関数を使用して、取得しPS1を復号するために端部で非常に単純な関数と、上記のように:それは使用しているが、コード自体はこの場合非常に簡単である

#include <config.h> 
#include "../bashtypes.h" 
#include <stdio.h> 
#include "../bashintl.h" 
#include "../shell.h" 
#include "common.h" 

int 
evalps1_builtin (list) 
    WORD_LIST *list; 
{ 
    char *ps1 = get_string_value ("PS1"); 
    if (ps1 != 0) 
    { 
    ps1 = decode_prompt_string (ps1); 
    if (ps1 != 0) 
    { 
     printf ("%s", ps1); 
    } 
    } 
    return 0; 
} 

不必要に複雑なインデント/ブレース規則とK & Rスタイルのプリプロトタイプ関数宣言と考えているもの - 私はそれらを一貫性のために現在のコードと同じにしておきました。

このコードは、単に関数を呼び出してPS1という環境変数を取得し、プロンプト文字列をデコードする別の関数を呼び出します。最後に、デコードされた文字列を標準出力に出力します。

もちろん、特定のニーズに応じて、コマンドとファイル名をevalps1から別のものに変更するだけで、そのコードを自分のものに置き換えることができます。

ステップ4:

ただ、トップレベルのディレクトリにものを構築する:

./configure 
make 

その最上位ディレクトリに表示されますbash実行可能ファイルは、(paxshに名前を変更することができます例えば、私はそれが祖先ほど普及しそうになるとは思わないが:-)

そして、それを実行している、あなたは本当のbashシェルで始まる、アクションでそれを見ることができます。

pax> mv bash paxsh 

pax> ./paxsh --version 
GNU bash, version 4.2-pax.0(1)-release (i686-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

pax> ./paxsh 

pax> echo $BASH_VERSION 
4.2-pax.0(1)-release 

pax> echo "[$PS1]" 
[pax> ] 

pax> echo "[$(evalps1)]" 
[pax> ] 

pax> PS1="\h: " 

paxbox01: echo "[$PS1]" 
[\h: ] 

paxbox01: echo "[$(evalps1)]" 
[paxbox01: ] 
+0

ニース。私はそれがそれより複雑だと思っていたでしょう... –

関連する問題