मेरी कमांड और इसके आउटपुट को चिपकाने की कमान


9

अक्सर मैं एक github बग की तरह कुछ पोस्ट करना चाहते हैं

$ ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms

अभी मैं आदेश चला, उपयोग screen's C-a C-[क्षेत्र उजागर करने के लिए, enterकि बफर में कॉपी करना है, यह में पेस्ट vim, यह एक फ़ाइल पर लिखने और फिर catउस में pbcopy। कोई बेहतर तरीका ज़रूर होगा।

क्या ऐसी कोई कमांड है जिसे मैं चला सकता हूं और teeजिस कमांड को मैं टाइप करता हूँ, $वह सब और आउटपुट से उपसर्ग है pbcopy? या कुछ भी पास? मैं कल्पना करता हूं

$ demo ping google.com
PING google.com (216.58.195.238): 56 data bytes
Request timeout for icmp_seq 0
64 bytes from 216.58.195.238: icmp_seq=0 ttl=53 time=1064.747 ms
^C
$

और अब मेरे द्वारा चिपकाई गई मूल चीज़ मेरे मैक क्लिपबोर्ड में है।


क्या यह वास्तव में ओएस एक्स के लिए विशिष्ट है?
phk

नहीं। फ़ाइल से क्लिपबोर्ड पर अन्य प्लेटफार्मों पर ले जाने के लिए आप जो भी उपयोगिता का उपयोग करते हैं, उसके लिए प्रतिस्थापित किया जा सकता है pbcopyऔर यह वही प्रश्न होगा।
पॉल टार्जन

2
जिज्ञासु: आप माउस का उपयोग क्यों नहीं करते?

2
आप पूरे विम भाग को छोड़ सकते हैं। बस चलाते हैं pbcopyऔर C-a C-]उसके स्टड के लिए।

@ माउस का उपयोग धीमा है और पाठ के कई स्क्रीन के लायक होने पर अच्छा काम नहीं करता है
पॉल टारजन

जवाबों:


10

एक विकल्प -xकमांड को चलाने वाले एक उप-संस्करण में अनुरेखण (साथ ) को सक्षम करना है । यह STDERR को कमांड और STDOUT को मानक आउटपुट लिखता है। दोनों को इकट्ठा करें और पाइप करें pbcopy:

$ ( set -x; ping -c 3 google.com ) 2>&1 | pbcopy

$ pbpaste
+ ping -c 3 google.com
PING google.com (173.194.217.138): 56 data bytes
64 bytes from 173.194.217.138: icmp_seq=0 ttl=44 time=37.436 ms
64 bytes from 173.194.217.138: icmp_seq=1 ttl=44 time=38.891 ms
64 bytes from 173.194.217.138: icmp_seq=2 ttl=44 time=39.329 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.436/38.552/39.329/0.809 ms

set -xएक दिलचस्प दृष्टिकोण है। अच्छी तरह से देखा गया!
डोपघोटी

मैं अपनी कमांड को भी प्रिंट करना पसंद करूंगा (अधिमानतः 2 अलग-अलग धाराओं पर अभी भी), और +होना चाहूंगा$
पॉल टारजन

1
@PaulTarjan: फिर उसके अनुसार PS4 बदलें। एक छूट (जो आपको आवश्यक नहीं है, लेकिन कुछ संभावित विकल्प दिखाता है) PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } ':। "\\ $" पहली बार "$" बनाता है, और उस चार को फिर कॉल के स्तर को दिखाने के लिए दोहराया जाता है। (पहले स्तर के लिए $, दूसरे स्तर के लिए $ $, आदि)
ओलिवियर दुलैक

7

आप scriptअपने प्रॉम्प्ट, कमांड और इसके आउटपुट सहित संपूर्ण इंटरैक्शन को कैप्चर करने के लिए यूटिलिटी का उपयोग कर सकते हैं :

script temp.log; cat temp.log | pbcopy
[ do stuff ]
[ end the interaction with ^D or logging out of the shell ]

फिर आप फ़ाइल की समीक्षा कर सकते हैं, और इसकी सामग्री पहले से ही आपके क्लिपबोर्ड पर होगी।

आप भी कर सकते हैं:

script temp.log 'somecommand'; cat temp.log | pbcopy

यह करीब है। इसमें मेरा पूरा प्रॉम्प्ट शामिल था जहां मैं सिर्फ एक चाहता हूं $ और यह मुझे कई कमांड करता है जहां मैं केवल एक चाहता हूं, और यह एक हेडर और पाद जोड़ता है जो मैं नहीं चाहता।
पॉल टार्जन

1
मुझे नहीं लगता कि यह एएनएसआई अनुक्रमों को दबा सकता है (जैसा कि डिजाइन से यह पूरे सत्र को पकड़ने के लिए है), लेकिन आप हेडर को दबा सकते हैं। के लिए मैन पेज देखें -q। आप sedANSI कोड्स को स्ट्रिप करने के लिए उपयोग कर सकते हैं : sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti

2
आप script temp.log env PS1='$ ' bash --norcइच्छित प्रांप्ट के साथ बैश प्राप्त करने के लिए उपयोग कर सकते हैं। वैकल्पिक रूप से आप अपने ~/.bashrcउपयोग को scriptबदलने के लिए जांच कर सकते हैं और प्रॉम्प्ट को बदल सकते हैं:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
एरिक


1

किसी अन्य उत्तर पर आपकी टिप्पणी से , आप नहीं चाहते कि आपका पूरा संकेत कॉपी हो, लेकिन केवल $

मैं इसे कैसे हल करूं बस:

16:54:53 [myname mydirectory] 535 $ bash
bash-3.2$ PS1='\$ '
$ echo some command
some command
$ exit
exit
16:57:17 [myname mydirectory] 536 $

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


एक अलग उपयोग के मामले के लिए जहां मैं सिर्फ कमांड चाहता हूं , इसका आउटपुट नहीं और शीघ्र नहीं, किसी को निर्देश देने में सक्षम होने के लिए, मैंने एक उपनाम स्थापित किया है, zv(कीबोर्ड पर "कमांड वी" के करीब) कॉपी करने के लिए। मेरे क्लिपबोर्ड पर अंतिम कमांड :

alias zv='printf %s "$(history -p \!\!)" | pbcopy'

क्लिपबोर्ड में printfट्रेसिंग न्यूलाइन को शामिल करने से बचने के लिए और कमांड प्रतिस्थापन के उपयोग पर ध्यान दें history


0

अभी मैं कमांड चलाता हूं, क्षेत्र को हाइलाइट करने के लिए स्क्रीन की सीए सी- का उपयोग करें, इसे उस बफर में कॉपी करने के लिए दर्ज करें,

यदि आप पहले से ही उपयोग करते हैं, GNU screenतो आप किसी बाहरी टूल का उपयोग करके सीधे चयन को कॉपी कर सकते हैं। उदाहरण के लिए, मैंने इसे ~/.screenrcलिनक्स पर जोड़ा :

bind b eval writebuf 'exec /bin/sh -c " xsel -i </tmp/screen-exchange"' 'exec /bin/sh -c "killall xsel"'

अब मैं चयन wih को चिह्नित कर सकता हूं Control- a [प्रेस, Spaceऔर अब प्रेस Control- a bचलाने के लिए xsel। यह मेरा विचार नहीं है, यह वास्तव में काफी सामान्य है । ध्यान दें कि कुछ लोग pbcopyइसके बजाय इसका उपयोग करते हैंxsel ताकि यह आपके लिए बिना किसी समस्या के काम कर सके।

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