2012-04-08 19 views
8

Olası Çoğalt:
Echo expanded PS1bash: PS1, PS2, ... nasıl değerlendirilir?

bir bash komut dosyası içinden PS1, PS2 vb 'değerlendirmek' için bir yolu var mı?

Geçerli PS1'un tüm öğelerini almak için alternatif araçlar kullanabilirim, ancak bu alternatif araçları kullanmak yerine tanımını yeniden kullanmak isterim. Örneğin

,

===================================== 
PS1 element -->  Alternate means 
===================================== 
\u   -->  $USER 
\h   -->  $HOSTNAME 
\w   -->  $PWD 
... 
===================================== 

ben çok iyi benim komut 'alternatif demektir' sütununu kullanabilirsin ama ben istemiyorum. Örneğin, PS1 numaralı telefonumda, PS1'u değerlendirerek basitçe yeniden kullanmak isteyebileceğim terminal kaçış dizileri aracılığıyla koyu mavi renkli kullanın.

+0

Belki başka insanlar biliyor, ama neden bahsettiğiniz hakkında hiçbir fikrim yok. Neyi başarmaya çalışıyorsun? – Kurt

+0

$ PS1, $ PS2'yi değerlendirmek ister misiniz? Veya, komut dosyanızın içindeki değişkenlere değer atfetmek ister misiniz? – Gangadhar

+0

"Değerlendirme" adlı bir işlev veya komut olduğunu varsayalım. 'PS1' değerlendirmesinin sonucu ne olmalı? –

cevap

10

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.

+0

Sisteminizde denediğinizden emin misiniz? $ ExpPS1'i denediğimde ve eklediğimde, "bash:: komut bulunamadı ..." değerini aldım. Ayrıca, çok satırlı bir komut istemeniz durumunda kafa -1 çalışmayabilir. Ayrıca, komut istememi koyu mavi renkte yazdırıyorum. Bu soruyu yayınlamamın sebebi budur: PS1imi, elemanlarını herhangi bir biçimde veya biçimde çoğaltmaksızın tamamen korumak istiyorum. Fyi, PS1'im şöyle ayarlandı: ''\ [\ 033 [0; 34m \] \ u \ \ $? \ \ N $ \ [\ 033 [0m \] 'w. Ben kesinlikle çözümünüzün marifetini beğenmiş olsam da, çok yavaştır: Herhangi bir sonuç görmeden önce 1-2 saniyelik bir boşluk var. – Harry

+0

Oldukça problemli bir çamaşır listeniz var :-) (1) Evet, sistemimde denedim, bu son bit gerçek bir transkript. (2) Evet, 'kafa -1', çok satırlı komutlar için çalışmaz, bunun için biraz daha ustalıklı olmanız gerekecek ve büyük olasılıkla satır sayısının veya" PS1 "sayımının ön işleminin onaylanmasını gerektirecektir. '\ n' bölümleri. (3) 'TERM' ayarınızı zorlamak zorunda kalmanıza rağmen problemin renkle ilgili olduğundan emin değilim. (4) Hız için kefil olamaz, bu, kabuğun başlatılması için ne kadar süreceğine bağlıdır. İkinci çözüm yetersiz ise, ilk önce bakmak gerekebilir. – paxdiablo

+0

Ama en azından bu sorunları çözmesi gerektiğine inanıyorum, ama _more_ çaba olabilir. Hatta rastgele bir 'PS1' dönüştürmek için C koduna benzer şeyler yapan bir betik yazabilirsiniz. – paxdiablo