私はエイリアスや機能を意味するものではありません。私は実際にbash
ソースコードに新しい内部コマンド全体を追加したいと考えています。内部コマンドをbashに追加するにはどうすればよいですか?
私はそれをコンパイルすると、シェル自体に新しいコマンドが組み込まれています。
これにはどのような手順がありますか?
私はエイリアスや機能を意味するものではありません。私は実際にbash
ソースコードに新しい内部コマンド全体を追加したいと考えています。内部コマンドをbashに追加するにはどうすればよいですか?
私はそれをコンパイルすると、シェル自体に新しいコマンドが組み込まれています。
これにはどのような手順がありますか?
これは実際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.o
をOFILES
の末尾に追加します。これにより、単にコードが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: ]
ニース。私はそれがそれより複雑だと思っていたでしょう... –
この質問はしばらくここにいましたが、あなたは '-f'可能考えるかもしれません。この機能が最近追加されたかどうかはわかりません。 – sjsam