açık kaynak yazılım büyük avantajlarından biri (ben sürümü 4.2 bakıyorum) içeren bir y.tab.c
dosya var bash
için kod indirirseniz kaynak, kuyu, açık :-)
olmasıdır decode_prompt_string()
fonksiyonu:.
char *decode_prompt_string (string) char *string; { ... }
Sen üstünkörü denemede gelen rağmen gerekli olan bütün destek rutinleri ile birlikte (yani ayıklamak ve sizin için iş yaptı bir yürütülebilir oluşturmak için deneyebilirsiniz, bu destek rutinleri çok gibi görünüyor Bu yüzden bu zor bir görev olabilir
Bunun dışında
yapabilirsiniz muhtemelen gibi bir şeyle sizin için genişleyen içine "hile" bash
:
Şimdi
expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1
| grep xyzzyplughtwisty
| head -1
| sed 's/xyzzyplughtwisty//g')
Ben okunabilmesi için birden fazla satır karşısındaki koyduk ama birinde yapıldı hat. Bu, geçersiz bir komut ileterek (umarız) geçersiz bir komut olan bash
'un etkileşimli bir örneğini çalıştırır.
Etkileşimli olduğu için, bu komut istemini yazdırır, böylece ilk satırı komut dizesi ile tutup o komut dizesini kaldırırım. Ne bitti sorusu olmalıdır.
pax> expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1 | grep xyzzyplughtwisty | head -1 | sed 's/xyzzyplughtwisty//g')
pax> echo "[$expPS1]"
[pax> ]
pax>
Ancak bu ve aslında şimdiki kabuk bir yerine size düzenli istemi verecek istemleri çok satırlı sorunu olan: Benim sistemimde
, bu ne alıyorum.
Eğer düzgün, kendisini bash
için biraz ekleyerek içerebilir yapmak istiyorsanız
. İç komut evalps1
eklemek için gereken adımları burada bulabilirsiniz. Önce, bash
"gerçek" ve benzeri FSF Basitçe bir satır değiştirmek :-) garanti amaçları için tüm bilgiyi inkar edemez ki (ben -pax
bit eklendi) bir ile karıştırmayın böylece support/mkversion.sh
değiştirin:
echo "#define DISTVERSION \"${float_dist}-pax\""
İkincisi, değişim `builtins/Makefile.in yeni bir kaynak dosyası eklemek için. Bu, birkaç adım gerektirir.
(a) DEFSRC
'un sonuna $(srcdir)/evalps1.def
ekleyin.
(b) OFILES
'un sonuna evalps1.o
ekleyin.
(c) gerekli bağımlılıkları ekleyin:
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
#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;
}
toplu: Eğer evalps1
komutu çalıştırdığınızda
evalps1.o: evalps1.def $(topdir)/bashtypes.h $(topdir)/config.h \
$(topdir)/bashintl.h $(topdir)/shell.h common.h
Üçüncüsü, builtins/evalps1.def
dosyayı kendisi eklemek, bu işletilirse koddur Bu, (exit.def
'dan değiştirdiğimden) GPL lisansıdır ve PS1
kodunu almak ve çözmek için son derece basit bir işlevdir.
Son olarak, sadece üst düzey dizinde şeyi inşa:
./configure
make
paxsh
yeniden adlandırıldı edilebilir görünür bash
, sonsuza kadar
:-) onun atası olduğu kadar yaygın hale gelecektir şüphe olsa Ve ister çalışan, eylem görebiliyorum:
Şimdi 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: ]
, verilen, bash
kod değişiklikleri yaparak eklemek için n iç komut bazıları tarafından overkill olarak kabul edilebilir, ancak PS1
doğru bir değerlendirme istiyorsanız, kesinlikle bir seçenektir.
Belki başka insanlar biliyor, ama neden bahsettiğiniz hakkında hiçbir fikrim yok. Neyi başarmaya çalışıyorsun? – Kurt
$ PS1, $ PS2'yi değerlendirmek ister misiniz? Veya, komut dosyanızın içindeki değişkenlere değer atfetmek ister misiniz? – Gangadhar
"Değerlendirme" adlı bir işlev veya komut olduğunu varsayalım. 'PS1' değerlendirmesinin sonucu ne olmalı? –