2012-04-08 29 views
8

संभव डुप्लिकेट:
Echo expanded PS1बैश: पीएस 1, पीएस 2, का मूल्यांकन कैसे करें ...?

वहाँ किसी भी तरह से एक bash स्क्रिप्ट के भीतर से PS1, PS2, आदि 'का मूल्यांकन' करने के लिए है?

हालांकि, मैं अपने वर्तमान PS1 के सभी तत्वों को प्राप्त करने के वैकल्पिक तरीकों का उपयोग कर सकता हूं, मैं वास्तव में इन वैकल्पिक तरीकों का उपयोग करने की बजाय इसकी परिभाषा का पुन: उपयोग करने में सक्षम होना चाहूंगा।

उदाहरण के लिए

,

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

मैं बहुत अच्छी तरह से मेरी स्क्रिप्ट में 'वैकल्पिक साधन' कॉलम इस्तेमाल कर सकते हैं, लेकिन मैं नहीं करना चाहती। मेरे PS1 में, उदाहरण के लिए, मैं टर्मिनल एस्केप अनुक्रमों के माध्यम से बोल्ड ब्लू रंग का उपयोग करता हूं जिसे मैं PS1 का मूल्यांकन करके पुन: उपयोग करने में सक्षम होना चाहता हूं।

+0

शायद अन्य लोगों को पता है, लेकिन मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं। आप क्या खत्म करने की कोशिश कर रहे हैं? – Kurt

+0

क्या आप $ PS1, $ PS2 को बेचना चाहते हैं? या आप अपनी स्क्रिप्ट के अंदर उन चरों को मानों को विशेषता देना चाहते हैं? – Gangadhar

+0

मान लीजिए कि 'मूल्यांकन' नामक एक फ़ंक्शन या कमांड है। 'पीएस 1 का मूल्यांकन' का नतीजा क्या होना चाहिए? –

उत्तर

10

ओपन सोर्स सॉफ्टवेयर में से एक बड़ा फायदा है कि स्रोत है, अच्छी तरह से, खुले :-)

आप bash के लिए कोड डाउनलोड करते हैं (मैं संस्करण 4.2 पर देख रहा हूँ), वहाँ एक y.tab.c फ़ाइल जिसमें है decode_prompt_string() समारोह:।

char *decode_prompt_string (string) char *string; { ... } 

आपको लगता है कि निकालने के लिए (किसी भी आवश्यक सहायता दिनचर्या के साथ-साथ और एक निष्पादन योग्य है जो आप के लिए काम किया है का निर्माण है, एक सरसरी कोशिश से कोशिश कर सकते हैं, उन समर्थन दिनचर्या एक बहुत होने लगते हैं , तो यह एक कठिन काम हो सकता है।


उसके अलावा, आप कर सकते हैं शायद "चाल" bash की तरह कुछ के साथ आप के लिए यह विस्तार हो रहा में:

expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1 
     | grep xyzzyplughtwisty 
     | head -1 
     | sed 's/xyzzyplughtwisty//g') 

अब मैं डाल दिया पठनीयता के लिए कई पंक्तियों के पार है कि लेकिन यह एक पर किया गया था लाइन।

यह क्या करता है bash का एक इंटरैक्टिव उदाहरण चलाता है, जो एक अमान्य कमांड (क्या उम्मीद है) है।

क्योंकि यह इंटरैक्टिव है, यह प्रॉम्प्ट प्रिंट करता है, इसलिए मैं उस पर कमांड स्ट्रिंग के साथ पहली पंक्ति पकड़ता हूं और उस कमांड स्ट्रिंग को हटा देता हूं। क्या छोड़ दिया गया है संकेत होना चाहिए।

pax> expPS1=$(echo xyzzyplughtwisty | bash -i 2>&1 | grep xyzzyplughtwisty | head -1 | sed 's/xyzzyplughtwisty//g') 

pax> echo "[$expPS1]" 
[pax> ] 

pax> 

बहरहाल, यह संकेत है और वास्तव में आप अपने नियमित शीघ्र बल्कि वर्तमान खोल एक से दे देंगे बहु लाइन के साथ समस्या है:

अपने सिस्टम पर, यह मैं क्या मिलता है।


आपको बस इतना करना यह ठीक से, यह अपने आप bash लिए एक छोटा सा जोड़ने शामिल हो सकता है चाहते हैं। आंतरिक कमांड evalps1 जोड़ने के चरण यहां दिए गए हैं।

पहले, support/mkversion.sh इतना बदल है कि आप इसे एक 'असली' bash, और इतना है कि FSF वारंटी प्रयोजनों :-) बस एक लाइन को बदलने के लिए सभी ज्ञान से इनकार कर सकते हैं (मैं -pax सा जोड़ा) के साथ भ्रमित नहीं होंगे:

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

दूसरा, नई स्रोत फ़ाइल जोड़ने के लिए `buildins/Makefile.in को बदलें। इसमें कई कदम हैं।

(ए) DEFSRC के अंत तक $(srcdir)/evalps1.def जोड़ें।

(बी) OFILES के अंत तक evalps1.o जोड़ें।

(ग) जोड़े आवश्यक निर्भरता:

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; 
} 

थोक:

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

तीसरा, builtins/evalps1.def फ़ाइल स्वयं जोड़ने के लिए, इस कोड का निष्पादित है कि जब आप evalps1 आदेश चला है इसमें से जीपीएल लाइसेंस है (चूंकि मैंने इसे exit.def से संशोधित किया है) PS1 प्राप्त करने और डीकोड करने के अंत में एक बहुत ही सरल कार्य के साथ। ,

./configure 
make 

bash प्रतीत होता है कि paxsh को नाम दिया जा सकता है, हालांकि मुझे शक है कि यह कभी अपने पूर्वज के रूप में के रूप में प्रचलित हो जाएगा :-)

:

अन्त में, सिर्फ शीर्ष स्तर की निर्देशिका में बात का निर्माण

और यह चल रहा है, आप कार्रवाई में इसे देख सकते हैं:

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: ] 

अब, दी, bash करने के लिए कोड में परिवर्तन करने के जोड़ने के लिए एक n आंतरिक कमांड को कुछ लोगों द्वारा ओवरकिल माना जा सकता है, लेकिन यदि आप PS1 का सटीक मूल्यांकन चाहते हैं, तो यह निश्चित रूप से एक विकल्प है।

+0

क्या आप वाकई अपने सिस्टम पर कोशिश कर रहे हैं? जब मैंने $ expPS1 को आजमाया और प्रतिबिंबित किया, तो मुझे मूल्य के रूप में "bash:: आदेश नहीं मिला ..." मिला। ध्यान दें कि जब आपके पास मल्टी-लाइन प्रॉम्प्ट होता है तो हेड -1 काम नहीं कर सकता है। इसके अलावा, मैं बोल्ड-ब्लू रंग में अपना प्रॉम्प्ट प्रिंट कर रहा हूं। इस सवाल को पोस्ट करने का यही कारण है: मैं अपने तत्वों को किसी भी आकार या रूप में डुप्लिकेट किए बिना पूरी तरह से अपने पीएस 1 को बनाए रखना चाहता हूं। Fyi, मेरा PS1 इस पर सेट है: ''\ [\ 033 [0; 34m \] \ u @ \ h $? \ W \ n $ \ [\ 033 [0m \] ' '। जबकि मुझे निश्चित रूप से आपके समाधान की सरलता पसंद है, यह बहुत धीमी है: मुझे कोई परिणाम देखने से पहले 1-2 सेकंड अंतर होता है। – Harry

+0

यह आपके पास होने वाली समस्याओं की एक कपड़े धोने की सूची है :-) (1) हां, मैंने अपने सिस्टम पर कोशिश की, कि आखिरी बिट एक वास्तविक प्रतिलिपि है। (2) हां, 'हेड -1' मल्टीलाइन प्रॉम्प्ट के लिए काम नहीं करेगा, आपको इसके लिए थोड़ा और सरल होना होगा और इसके लिए शायद लाइन गिनती के पूर्व ज्ञान या 'पीएस 1' गिनती के प्री-प्रोसेसिंग की आवश्यकता होगी '\ n' खंड। (3) मुझे यकीन नहीं है कि समस्या रंग के साथ क्या है हालांकि आपको अपनी 'टीईआरएम' सेटिंग को मजबूर करना पड़ सकता है। (4) मैं गति के लिए झुकाव नहीं कर सकता, यह इस बात पर निर्भर करता है कि खोल शुरू करने में कितना समय लगता है। यदि दूसरा समाधान अपर्याप्त है, तो आपको पहले को देखने की आवश्यकता हो सकती है। – paxdiablo

+0

लेकिन मुझे संदेह है कि यह _more_ प्रयास हो सकता है, हालांकि कम से कम यह उन समस्याओं को हल करना चाहिए। आप एक स्क्रिप्ट भी लिख सकते हैं जो सी कोड को समान तरीके से 'PS1' का अनुवाद करने के लिए समान चीजें करता है। – paxdiablo

संबंधित मुद्दे