मैं कमांड लाइन से अंतिम आउटपुट का पुन: उपयोग कैसे करूं?


44

मुझे पता है कि कंसोल से अंतिम आउटपुट का पुन: उपयोग कैसे करना है, अर्थात:

pv-3:method Xavier$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/Library/Python/2.6/site-packages
pv-3:method Xavier$ cd **LASTOUTPUT**

7
तुम नहीं कर सकते; यहाँ कुछ पृष्ठभूमि स्पष्टीकरण है । आपकी सबसे अच्छी शर्त है कि आप कमांड को फिर से चलाएं, जैसा कि अब तक पोस्ट किए गए दो उत्तरों में देखा गया है।
गिल्स एसओ- बुराई को रोकना '

आप नहीं पर कब्जा उत्पादन के रूप में एक डिवाइस के लिए सीधे भेजा जा सकता है /dev/tty, लेकिन यह करने के लिए कब्जा कुछ भी भेजा करने के लिए संभव होना चाहिए stdoutया stderr, पर्याप्त हो सकता है।
मिकेल

@ गिल्स - जब तक आप @ मैडेटम के उत्तर का उपयोग नहीं करते, तब तक!
सिमॉन

@ गिल्स: लेकिन कमांड के आउटपुट को कैप्चर (और पास) करने वाले किसी व्यक्ति द्वारा बनाया गया शेल हो सकता है और उपयोगकर्ता के लिए कैप्चर किए गए आउटपुट को उसके आगे के कमांड से संदर्भित करने के लिए उपलब्ध कराएगा। शायद, कुछ मौजूदा भी हैं, न कि इतने लोकप्रिय गोले जो कम या ज्यादा जटिलताओं के साथ इसकी अनुमति देते हैं ...
imz - Ivan Zakharyaschev

जवाबों:


40

मान लिया जाए:

% python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.7/site-packages
% cd $(!!)
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
% pwd
/usr/lib/python2.7/site-packages

1
धन्यवाद! टाइप करना बहुत आसान नहीं है लेकिन यह माउस के लिए जा रहा है।
मेथोफिकेशन

2
आप $ () के बजाय बैकटिक्स का उपयोग कर सकते हैं (जो मैं समझ नहीं पा रहा हूं कि इस इंटरफ़ेस को विकीफाई कैसे नहीं किया जाए), लेकिन मैंने पाया है कि मेरे लिए बैक-शिफ्ट-1-शिफ्ट-1-बैक-बैक हिट करना असहज है , और मैं पठनीयता के लिए संभव होने पर $ () का उपयोग करने की आदत डालने की कोशिश कर रहा हूं।
jsbillings

@jsbillings मेरा जवाब नीचे देखें। मैंने उत्तर में प्रदर्शित करने के लिए \ `टाइप किया। और '\' प्रदर्शित करने के लिए, हमेशा की तरह '\\' टाइप करें।
यासोउर

3
+1 मैं सोच रहा था कि कैसे घोंसला बनाया जाए `backtick-commands`! cd $(dirname $(which python))यहाँ मैं आता हूं!
एड ब्रानिन

21
बस एक नोट, याद रखें कि यह कमांड को पुन: निर्देशित कर रहा है। यदि आपके कमांड के साइड इफेक्ट्स हैं, तो यह आपके लिए काम नहीं कर सकता है।
रिच होमोलका

13

अभी तक उल्लेख नहीं किया गया है, एक चर का उपयोग करें:

dir=$( python -c ... )
cd "$dir"

3
ठीक ठीक। क्योंकि यह एक शेल है, लोग अक्सर भाषा की सुविधाओं के बारे में भूल जाते हैं जो बैश प्रदान करता है, जैसे कि लूप और असाइनमेंट।
इवान

बस कह सकते हैंcd $dir
temporary_user_name

3
@Aerovistae, उद्धरण आवश्यक हैं यदि आप नहीं जानते कि मूल्य कहां से आता है:
ग्लेन जैकमैन

@glenn, (मुझे पता है कि यह पूरे अन्य प्रश्न हो सकता है, लेकिन यदि उत्तर छोटा है :) तो क्या आप अधिक बता सकते हैं / एक उदाहरण प्रदान कर सकते हैं जहां उद्धरणों का उपयोग न करने से चीजें टूट जाएंगी?
एलेक्सी


8

अन्य सभी समाधानों में आपके वर्कफ़्लो को संशोधित करना या कमांड को दो बार चलाना शामिल है, जो उपयुक्त नहीं हो सकता है अगर इसे चलाने में लंबा समय लगता है, या पुन: प्रयोज्य नहीं है (जैसे कि यह एक फ़ाइल को हटाता है - फिर से रन करना एक अलग परिणाम उत्पन्न करेगा)।

तो यहाँ एक और अधिक जटिल विचार है अगर आपको इसकी आवश्यकता है:

.bashrc

exec > >(tee -a ~/$$.out)

PROMPT_COMMAND='LASTLINE=$(tail -n 1 ~/$$.out)'

trap 'rm ~/$$.out' EXIT

जल्दबाज़ी करो

$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.6/dist-packages
$ cd $LASTLINE
$ pwd
/usr/lib/python2.6/dist-packages

इसके कुछ मुद्दे हैं, इसलिए इसका मतलब सिर्फ शुरुआती बिंदु है। उदाहरण के लिए, आउटपुट फ़ाइल ( ~/<pid>.out) बहुत बड़ी हो सकती है और आपकी डिस्क को भर सकती है। इसके अलावा, यदि आपका पूरा खोल काम करना बंद कर देता है तो उसकी teeमृत्यु हो सकती है।

इसे केवल पिछले कमांड से आउटपुट को कैप्चर करने के लिए संशोधित किया जा सकता है , जोश में हुक preexecऔर precmdहुक का उपयोग करता है, या बैश में उनमें से एक एमुलेशन , लेकिन यहां वर्णन करने के लिए यह अधिक जटिल है।


6
मूल विचार अच्छा है, लेकिन कार्यान्वयन नहीं है। शेल सत्र में मानक आउटपुट एक टर्मिनल नहीं बल्कि एक पाइप है, जो कुछ कार्यक्रमों को अलग तरह से व्यवहार करने का कारण बनेगा। राइट टू स्टैडआउट और स्टाइटर को लिखता है या टैटी को निर्देशित करने के बीच कोई सिंक्रनाइज़ेशन नहीं होगा, इसलिए उदाहरण के लिए आप अगले प्रॉम्प्ट के बाद प्रदर्शित कमांड आउटपुट देख सकते हैं। आपने teeसंकेतों से भी सुरक्षा नहीं की है ( Ctrl+Cअधिक कुछ आदेशों को दबाने और चलाने की कोशिश करें)। scriptउपयोगिता का उपयोग करें, जिनमें से कोई भी समस्या नहीं है।
गिल्स एसओ- बुराई को रोकें '

जानकार अच्छा लगा! मैं अभी भी अपने कमांड लाइन बेसिक्स पर काम कर रहा हूं, इसलिए यह संभवतः मेरे लिए एक ओवरकिल है, साथ ही मैं इसे किसी भी कंप्यूटर पर उपयोग करने में सक्षम होना चाहता हूं, लेकिन मुझे याद होगा कि अगर मैं कभी भी एक अच्छे स्तर पर पहुंचता हूं।
मेथोडिफिकेशन

8

एक पारंपरिक खोल के लिए एक काम का मसौदा:

ttyid=$(readlink /proc/$$/fd/1)
\___/   \______/ \___/ |  |  |
  |         |      |   |  |  \- 0: stdin 
  |         |      |   |  |     1: stdout <- our interest
  |         |      |   |  |     2: stderr
  |         |      |   |  \- fd is, maybe, filedescriptor
  |         |      |   |
  |         |      |   \- $$ is the PID of the current process (shell,
  |         |      |      in our case)
  |         |      |
  |         |      \- you know, much runtime stuff is here
  |         |
  |         \- readlink extracts the symbolic link of /proc/$$/fd/1
  |            lrwx------ 1 stefan stefan 64 2011-03-18 09:11
  |            /proc/22159/fd/1 -> /dev/pts/4
  |
  \- /dev/tty3 for real shell, /dev/pts/3 for xterm

अब हम स्क्रीन को एक फाइल में कैच कर सकते हैं। सूडो की जरूरत है।

id=${ttyid//\/dev\/tty}
sudo cat /dev/vcs$id > screen.dump

एप्रोपोस screendump: इसलिए नामित कार्यक्रम मेरे लिए और अधिक काम नहीं करता है। शायद पुराने गुठली के लिए ही। / dev / pts / N ने मेरे लिए भी काम नहीं किया। हो सकता है कि आपको कुछ वैकल्पिक MKDEV / dev में हों - मुझे कुछ के बारे में याद है /dev/cuaN, लेकिन मैं गलत हो सकता हूं।

हम screen.dump का उपयोग करने के बजाय आउटपुट को पाइप करना चाहते हैं। लेकिन किसी तरह यह काम नहीं करता है - कभी-कभी यह ENTER का इंतजार करता है।

कैप्चरिंग फीडफीड्स के साथ एक सामान्य टेक्स्टफाइल नहीं है, लेकिन उदाहरण के लिए - एक क्रम में 80x50 चार्ट।

अंतिम 2 लाइनों को चुनने के लिए, कमांड के आउटपुट के लिए 1, और प्रॉम्प्टिंग लाइन के लिए एक, मैं इसे वापस करता हूं, 160 वर्ण चुनें, फिर से वापस लाएं और 80 चुनें।

rev vcs4.dat | sed 's/\(.\{160\}\).*/\1/g' | rev | sed 's/\(.\{80\}\).*/\1/g'

बस अगर आपने कभी सोचा है कि एक revकार्यक्रम क्यों है ।

आलोचना:

  • पहले कमांड दर्ज किए जाते हैं, इस प्रकार लाइन को आगे बढ़ाया जाता है। अच्छी तरह से - 3-अंतिम पंक्ति या कुछ लेने के लिए सिर्फ एक संख्यात्मक एक्सर्साइज़। मैंने मुख्य रूप से एक अलग विंडो में काम किया।
  • हर किसी के पास 80x50 की स्क्रीन नहीं है। खैर, हम जानते हैं। आपकी खुशी के लिए $ COLUMNS और $ ROWS है।
  • आउटपुट सबसे नीचे नहीं है। एक ताजा और युवा खोल ऊपरी पंक्तियों में हो सकता है। अच्छी तरह से सरल है: मूल्यांकन करें कि क्या चल रहा है। किस प्रॉम्प्ट का उपयोग किया जाता है। कुछ शीघ्र पहचान करें और शेल-प्रॉम्प्ट के साथ अंतिम पंक्ति ढूंढें। इससे पहले की लाइन (या 2. पहले) में डायरेक्टरी होनी चाहिए।

पहला आरेख स्पष्टीकरणहोम के साथ बनाया गया है


+1, मुझे कर दियाalias tee2tty='tee $(readlink /proc/$$/fd/1)'
टोबियास किंजलर

7

इसे इस्तेमाल करे:

$ cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
$ pwd
/Library/Python/2.6/site-packages

6

तो, उह, यहाँ एक जवाब है:

यदि आप X के नीचे चल रहे हैं, तो उस आउटपुट को चुनें जिसे आप माउस से कॉपी करना चाहते हैं, और फिर उसे पेस्ट करने के लिए मध्य-क्लिक करें।

यदि आप एक टेक्स्ट कंसोल पर चल रहे हैं, तो आप gpm के साथ एक समान कार्य कर सकते हैं ।


1
+1 - अच्छा जवाब! आप GNU स्क्रीन ( gnu.org/software/screen ) का उपयोग करके, भले ही आप X नहीं चला रहे हों, आप एक ही चीज़ प्राप्त कर सकते हैं ।
सिमोन

1
इतना स्पष्ट लग रहा था कि मैं यह कहने में संकोच कर रहा था। लेकिन बाकी सब इतना चालाक होने में व्यस्त हैं। :)
Mattdm

यह यहाँ एकमात्र उत्तर है जो ओपी को अंतिम पंक्ति का पुन: उपयोग करने की अनुमति देता है - बाकी सब कुछ फिर से कमांड चलाने पर जोर देता है, जो पूरी तरह अप्रासंगिक और विनाशकारी के बीच कहीं भी हो सकता है :) लेकिन ओपी ने कहा कि पुन: उपयोग करें
सिमोन

@ साइमन: वास्तव में, मेरा जवाब नहीं है। न ही ग्लेन की है।
मिकेल

@ मिकेल: सच है, लेकिन उन्हें आपको पहले से कुछ करने की ज़रूरत है, या पहली बार सही ढंग से।
Mattdm

1

(यह एक काम का जवाब नहीं है, दुर्भाग्य से, लेकिन अभी भी कुछ उत्सुक है। कोई व्यक्ति अच्छी तरह से उस सुविधा के कार्यान्वयन को पूरा करने की कोशिश कर सकता है जिसके बारे में मैं आपको बताने जा रहा हूं।)

में eshellEmacs अंदर, वे इस तरह के एक सुविधा है चाहता था, लेकिन यह एक पूरी तरह से (जो तथापि है में लागू नहीं किया है प्रलेखन में परिलक्षित )।

उदाहरण के लिए:

~ $ pwd
~
~ $ /bin/echo $$
~
~ $ /bin/pwd
/home/imz
~ $ /bin/echo $$

~ $ 

आप देखते हैं, केवल निर्माण के आउटपुट को $$चर में कैप्चर किया जा सकता है ।

लेकिन ठीक है, कुछ विशिष्ट प्रोग्रामिंग ( eshell-mark-output"esh-mode.el" में cf. कार्यान्वयन), और आप एक फ़ंक्शन लागू कर सकते हैं जो पिछले आउटपुट को "चिह्नित" करता है और इसे फ़ंक्शन के परिणाम के रूप में वापस करता है; ताकि आप किसी एस्केल कमांड में उस फंक्शन का इस्तेमाल कर सकें, जिसके लिए आप पूछ रहे हैं - एलीश फंक्शंस का इस्तेमाल एलीश कमांड्स में किया जा सकता है।

~ $ /bin/echo (buffer-name)
*eshell*
~ $ /bin/echo (car '(a b c))
a
~ $ 

0

यदि आपको लगता है कि आप हिट करने से पहले आउटपुट का पुन: उपयोग करना चाहते हैं Enter, तो आप इसे एक चर में बचा सकते हैं: tmp=$(लाइन की शुरुआत में और )अंत में जोड़ें। (यह कमांड आउटपुट के अंत में किसी भी रिक्त लाइन को हटाता है, और वास्तव में किसी भी अंतिम न्यूलाइन को निकालता है; यह शायद ही कभी मायने रखता है।)

tmp=$(python -c )
echo "$tmp"
cd "$tmp"

यदि आपका शेल ksh या zsh है, तो यहां एक उपयोगी फ़ंक्शन है जिसका उपयोग आप इसे और अधिक स्वचालित बनाने के लिए कर सकते हैं। (यह बैश में कोई मदद नहीं है क्योंकि इसे मूल शेल में निष्पादित होने वाली पाइपलाइन में अंतिम कमांड की आवश्यकता होती है, जो केवल ksh (pdksh नहीं) और zsh में होती है।)

keep () {
  local line IFS=$'\n'
  kept=
  while read -r line; do
    printf '%s\n' "$line"
    kept=$kept$line$IFS
  done
}
alias keep=k

इसे इस तरह से उपयोग करें:

python -c  |k
cd $kept

0
cd $(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | tee $(readlink /proc/$$/fd/1))

( 4485 के उत्तर पर निर्माण )

यह बहुत टाइपिंग है, इसलिए एक उपनाम बनाएं:

alias tee2tty='tee $(readlink /proc/$$/fd/1)'

तो बस बुलाओ cd $(python -c ... | tee2tty)

इस कोर्स के लिए आपको पहले से ही पता होना चाहिए कि आप आउटपुट के साथ क्या करना चाहते हैं, लेकिन कमांड को केवल एक बार कॉल करने का फायदा है।


0
$ cd \`python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"\`

चाल चलेगा।

अधिक जानकारी के लिए यहां पढ़ें: कमांड प्रतिस्थापन


1
arumug: bahamat ने पहले ही लगभग एक ही उत्तर पोस्ट किया है । अगर पहले से ही कमांड में बैकटिक्स हैं तो आपका संस्करण backticks के साथ काम नहीं करेगा।
गिल्स एसओ- बुराई को रोकें '

0

एक बेहतर उपाय है:

बस !!निष्पादित कमांड के बाद प्रिंट करें और आपको बार-बार आउटपुट मिलेगा।

उदाहरण के लिए

यहाँ छवि विवरण दर्ज करें

मूल:

https://askubuntu.com/questions/324423/how-to-access-the-last-return-value-in-bash


!!अंतिम आदेश से परिणाम को दोहराता नहीं है, यह अंतिम आदेश को फिर से चलाता है। यदि jot -r 1 0 10000 और 1000 के बीच एक एकल यादृच्छिक संख्या देता है, तो उस कमांड को एक बार 539चलाने और प्राप्त करने के बाद , चलने !!की संभावना कुछ अन्य नंबर देगी। !!यदि पिछली कमांड को चलाने में महत्वपूर्ण समय लगता है, या एक ऑपरेशन को दोहराता है जो बार-बार नहीं होना चाहिए (जैसे फ़ाइल बदलना)।
कालेब

1
अच्छा पकड़ा। हालांकि मुझे गलत साबित करने का एक आसान तरीका है: $ RANDOM गूंज; !!
तेबे

मीठा - उस के बारे में पता नहीं था! धन्यवाद।
कालेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.