माउस के बिना, मेरे क्लिपबोर्ड पर संपूर्ण कमांड लाइन की प्रतिलिपि कैसे करें?


20

कल्पना कीजिए कि मेरे टर्मिनल में यह रेखा है:

youtube-dl --get-thumbnail --extract-audio --audio-format mp3 https://www.youtube.com/watch?v=

इसका परीक्षण करने के बाद, मैं इस लाइन को अपने क्लिपबोर्ड पर कॉपी करना चाहूंगा और इसे किसी स्क्रिप्ट फ़ाइल में पेस्ट कर सकता हूं। कमांड का आउटपुट नहीं । लेकिन, माउस का उपयोग किए बिना ऐसा करना। मुझे कीबोर्ड पर ही अपने हाथ रखना पसंद है। मुझे लगता है कि इस तरह से तेज है, कुछ कोडिंग करने के लिए :)

जवाबों:


22

मेरा जवाब तीन अलग-अलग वाक्यविन्यासों में एक सरल कमांड प्रदान करता है, जो सभी समान रूप से काम करते हैं, लेकिन एक दूसरे की तुलना में थोड़ा छोटा और आसान है। तीसरी भिन्नता एक तथाकथित उपनाम है, इसका मतलब है कि आप कमांड को एक कस्टम नाम निर्दिष्ट कर सकते हैं और इसे निष्पादित करके कह सकते हैं कि जटिल सामान को याद किए बिना।

तैयारी:

सबसे पहले, पैकेज को स्थापित करें xselजो आपको टर्मिनल से एक्स क्लिपबोर्ड तक पहुंचने की अनुमति देता है:

sudo apt-get install xsel

कमांड भिन्नता 1 (छोटा):

उसके बाद, आप पिछले कमांड को क्लिपबोर्ड पर कॉपी करने के लिए निम्न लाइन टाइप कर सकते हैं:

xsel -ib <<<!!:q

आप दूसरे नवीनतम आदेश को कॉपी, की जगह चाहते हैं !!के साथ !-2तीसरे नवीनतम उपयोग के लिए, !-3और इतने पर।

यह समझने के लिए कि आप क्या चला रहे हैं, यहाँ कमांड का संक्षिप्त विराम है:

  • xselX क्लिपबोर्ड तक पहुंचने के लिए एक कमांड-लाइन टूल है।
    अधिक जानकारी के लिए, यह ऑनलाइनमैनपेज आइकन या पृष्ठ पर चल रहा है पढ़ें man xsel

    • -iपैरामीटर बताता xselstdin से पढ़ने के लिए (आमतौर पर इस साधन कीबोर्ड इनपुट, लेकिन हम यहां रीडायरेक्ट कुछ करने जा रहे हैं)
    • -bपैरामीटर निर्दिष्ट करने के बजाय क्लिपबोर्ड एक्स के "प्राथमिक" या "माध्यमिक" चयन का उपयोग करें।
  • <<<एक विशेष बैश सिंटैक्स है जिसे "हियर स्ट्रिंग" कहा जाता है।
    यह मूल रूप से फैलता है (मूल्यांकन नहीं करता है!) तर्क (केवल एक!) इसके बाद और इसे स्ट्रिंग के रूप में पुनर्निर्देशित करता है कमांड के स्टडिन (मानक इनपुट) से पहले / जिसके बाद यह खड़ा होता है।

  • !!:qको बैश में इतिहास विस्तार के लिए "बैंग कमांड" कहा जाता है। यह स्वयं को पहले से टाइप की गई कमांड लाइन से बदल देता है।
    अधिक जानकारी के लिए, इसे चलाकर स्थानीय man historyऑनलाइन पेज पढ़ें (ऑनलाइन मैनपेज उपयोगी नहीं है)।

    • !!पिछले कमांड लाइन के लिए खड़ा है और के लिए एक पर्याय है !-1
      जाहिर है !-2मतलब है तो दूसरी आखिरी कमांड लाइन। माइनस साइन को न भूलें -, अन्यथा यह आपके द्वारा लिखे गए 2nd (3rd / ...) कमांड को लौटा देगा।
    • :qसंशोधित धमाके कमान और बैश बताता एकल उद्धरण में प्रतिस्थापन संलग्न करने ( ') खोल से विस्तार को रोकने के लिए।

कमांड भिन्नता 2 (थोड़ी लंबी):

echo !!:q | xsel -ib
  • echo टर्मिनल के स्टडआउट के लिए अपने सभी तर्कों को मुद्रित करने का सरल काम है।

  • !!:qको बैश में इतिहास विस्तार के लिए "बैंग कमांड" कहा जाता है। यह स्वयं को पहले से टाइप की गई कमांड लाइन से बदल देता है।

    • !!पिछले कमांड लाइन के लिए खड़ा है और के लिए एक पर्याय है !-1। जाहिर है !-2मतलब है तो दूसरी आखिरी कमांड लाइन। माइनस साइन को न भूलें -, अन्यथा यह आपके द्वारा लिखे गए 2nd (3rd / ...) कमांड को लौटा देगा।
    • :qसंशोधित धमाके कमान और बैश बताता एकल उद्धरण में प्रतिस्थापन संलग्न करने ( ') खोल से विस्तार को रोकने के लिए।
  • |एक पाइप है। यह कमांड के टर्मिनल आउटपुट ("स्टडआउट") को उसके बाद कमांड के टर्मिनल इनपुट ("स्टडिन") पर रीडायरेक्ट करता है।

  • xselX क्लिपबोर्ड तक पहुंचने के लिए एक कमांड-लाइन टूल है।
    अधिक जानकारी के लिए, यह ऑनलाइनमैनपेज आइकन या पृष्ठ पर चल रहा है पढ़ें man xsel

    • -iपैरामीटर बताता xselstdin से पढ़ने के लिए (आमतौर पर इस साधन कीबोर्ड इनपुट, लेकिन हम यहां रीडायरेक्ट कुछ करने जा रहे हैं)
    • -bपैरामीटर निर्दिष्ट करने के बजाय क्लिपबोर्ड एक्स के "प्राथमिक" या "माध्यमिक" चयन का उपयोग करें।

कमांड भिन्नता 3 (उपनाम):

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

दुर्भाग्य से, चूंकि बैंग कमांड एक विशेष बैश फीचर हैं और एलियास का समाधान होने से पहले विस्तारित हो जाते हैं, इसलिए आप ऊपर दिए गए विभिन्न प्रकारों में से किसी एक को उर्फ ​​नहीं कर सकते। !! भाग काम नहीं करेगा। हालांकि एक समाधान है।

उपनाम सेट करने के लिए, अपने टर्मिनल में निम्न पंक्ति चलाएँ। ध्यान दें कि आपने इसके बजाय किसी मान्य बैश चर नाम को चुना हो सकता है copylastcommand:

alias copylastcommand='history -p \!\! | xsel -ib'

यह हालांकि आपके वर्तमान बैश सत्र के लिए केवल स्थायी है, जिसका अर्थ है कि टर्मिनल विंडो बंद करने के बाद उर्फ ​​गायब हो जाएगा। यदि आप अपनी ~/.bashrcफ़ाइल के अंत में इस लाइन को ऊपर या अपनी फ़ाइल में जोड़कर अपने प्रत्येक बैश सत्र में इसे लगातार बना सकते हैं ~/.bash_aliases

फिर, लाइन का एक छोटा ब्रेक:

  • alias name='command'बैश में एक उपनाम सेट करने के लिए वाक्यविन्यास है। commandजब भी आप पर अमल चलाया जाएगा nameअब से।

  • history -p \!\!Stdout (मानक आउटपुट) के लिए पहले निष्पादित कमांड लाइन आउटपुट। -pस्विच के बिना , यह न केवल प्रिंट करेगा, बल्कि कमांड को फिर से चलाएगा।
    ध्यान दें कि हमें बैकलिश ( !) के साथ बैंग्स ( ) से बचने की जरूरत है \, क्योंकि अन्यथा हम उन्हें उर्फ ​​सेट करने की कोशिश करते हैं, जो कि उर्फ ​​को सेट करने की कोशिश करते हैं, क्योंकि उन्हें कोई मतलब नहीं है कि वे उर्फ ​​में होने की जरूरत है।
    फिर, आप [n] -th हाल की कमांड को दूसरे बैंग के साथ बदलकर निर्दिष्ट कर सकते हैं -n, जैसे \!-2

  • |एक पाइप है। यह कमांड के मानक आउटपुट ("स्टडआउट") को उसके बाद कमांड के टर्मिनल मानक ("स्टडिन") पर पुनर्निर्देशित करता है।

  • xselX क्लिपबोर्ड तक पहुंचने के लिए एक कमांड-लाइन टूल है।
    अधिक जानकारी के लिए, यह ऑनलाइनमैनपेज आइकन या पृष्ठ पर चल रहा है पढ़ें man xsel

    • -iपैरामीटर बताता xselstdin से पढ़ने के लिए (आमतौर पर इस साधन कीबोर्ड इनपुट, लेकिन हम यहां रीडायरेक्ट कुछ करने जा रहे हैं)
    • -bपैरामीटर निर्दिष्ट करने के बजाय क्लिपबोर्ड एक्स के "प्राथमिक" या "माध्यमिक" चयन का उपयोग करें।

1
अच्छा जवाब, लेकिन क्या आप पाइप से बच सकते हैं? मान जाओ ना? <<<"!!" xsel -ib
कोस

@kos हाँ, धन्यवाद। जिससे यह थोड़ा आसान हो जाता है। क्या आप मेरे दिमाग को यह याद रखने में मदद कर सकते हैं कि <<<संरचना को फिर से कैसे कहा जाता है? और मुझे लगता <<<!!:q xsel -ibहै कि बेहतर है (हिस्ट्री बैंग कमांड को उद्धृत करते हुए), या आप असहमत हैं?
बाइट कमांडर

लेकिन !!:qएकल उद्धरण का उपयोग करता है ( ') ...
बाइट कमांडर

आप सही हैं, विस्तार का उपयोग किया जाएगा <<<"!!" xsel -ib। हां, <<<!!:q xsel -ibबेहतर है, इसके लिए जाएं।
कोस

अच्छा है, xselदिलचस्प वाक्यविन्यास है
सर्गी कोलोडाज़नी

5

आप उपयोग कर सकते हैं xclip:

some_command | xclip -selection c

तो आप के मामले में:

youtube-dl .... | xclip -selection c

c क्लिपबोर्ड के लिए खड़ा है।

आपको xclipपहले स्थापित करने की आवश्यकता हो सकती है :

sudo apt-get install xclip

संपादित करें:

यदि आप बस चाहते हैं कि आपके द्वारा टाइप किया गया कमांड (आउटपुट नहीं) क्लिपबोर्ड पर कॉपी किया जाए, तो आप यहां स्ट्रिंग्स का उपयोग कर सकते हैं:

 xclip -selection c <<<"$(echo foobar)"

या एक पाइप:

echo foobar | xclip -selection c

1
मुझे अभी भी कमांड आउटपुट मिलता है, लेकिन मैं सिर्फ लाइन ही चाहता हूं।
वाल्टर सिल्वा

echo "command" | xclip -selection clipboard... या यह एक स्क्रिप्ट के तहत बनाने~/.bin : echo "$@" | xclip -selection clipboard। कहते हैं कि आप इसे "cpy" के रूप में सहेजते हैं, फिर आप cpy youtube-dl stuffइसे निष्पादित किए बिना क्लिपबोर्ड पर कॉपी कर सकते हैं ।
एलेक्स

और अगर आप चाहते हैं कि इसे क्रियान्वित किया जाए ... echo "$@" | xclip -selection c && $@, या कुछ और अधिक स्पष्ट हो तो ...
एलेक्स

@ValterHenrique कृपया मेरे संपादन की जाँच करें ..
heemayl

3

मैंने ऐसा करने के लिए zshउस उपयोग के लिए थोड़ी स्क्रिप्ट बनाई है xclip:

#!/bin/zsh
export HISTFILE=~/.zsh_history
fc -R
fc -l | tail -n 2 | sed -n '1p' | sed 's/[0-9]*  //' | xclip -selection c

यह स्क्रिप्ट उस आखिरी कमांड को कॉपी करता है जिसे शेल / टर्मिनल में सिस्टम के क्लिपबोर्ड में दर्ज किया गया था। यह एक विशिष्ट रिमोट सर्वर पर काम नहीं करेगा।

मुझे लगा कि इस पटकथा को लिखने में मुझे सिर्फ एक-दो मिनट का समय लगेगा, लेकिन जब मैंने zshइतिहास को संभाला, तो मुझे काम करते हुए आश्चर्यजनक रूप से लंबा समय लगा ।

इसमें tail -n 2पहली sedऔर इस तथ्य से निपट रहे हैं कि इस लिपि की कमान खुद इतिहास में दर्ज की जा रही है और इसलिए यह इतिहास की दो पंक्तियाँ प्राप्त करती है और अंतिम को हटा देती है।

यह स्क्रिप्ट काम करती है, और यह एक मजेदार पहेली की तरह थी, लेकिन अगर मैं इसके साथ करने का एक सरल या अधिक सुरुचिपूर्ण तरीका है, तो मैं वास्तव में उत्सुक हूं zsh


वैसे आप शायद tailऔर sedएक या दो आदेशों को सरल बना सकते हैं । उन आदेशों का उपयोग !!किया जाता है जिन्हें यहां समझाया गया है - यह ZSH में उपलब्ध होना चाहिए ....
विल्फ

ओह, !!वास्तव में ऐसा लगता है कि यह यहाँ उपयोगी होगा, धन्यवाद!
एलेक

0

मैं एक क्लिपबोर्ड प्रबंधक के रूप में उपयोग कर रहा हूं, इसलिए।

alias pbpaste='xclip -i -selection clipboard -o'
alias pbcopy='xclip -selection clipboard'
vimscratch='vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' 

क्लिपबोर्ड पर अंतिम कमांड

alias last2cb='fc -ln -1 | pbcopy'

क्लिपबोर्ड से विम स्क्रैच

alias vcb='pbpaste | vimscratch -'

ZSH विशिष्ट

# Copy the most recent command to the clipboard
function _pbcopy_last_command(){
    fc -ln -1 | pbcopy
}
zle -N pbcopy-last-command _pbcopy_last_command
bindkey '^x^y' pbcopy-last-command
# Ctrl-x Ctrl-y  to copy last command to the clipboard


# Edit content of clipboard on vim (scratch buffer)
function _edit_clipboard(){
    pbpaste | vim -c 'setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile' -
}
zle -N edit-clipboard _edit_clipboard
bindkey '^x^v' edit-clipboard
# Ctrl-x Ctrl-v to edit clipboard on vim


# define function that retrieves and runs last command
function run-again {
    # get previous history item
    zle up-history
    # confirm command
    zle accept-line
}
# define run-again widget from function of the same name
zle -N run-again
bindkey '\er' run-again
# alt-r to run last command again

मुझे लगता है कि ये विचार आपको अपना समाधान बनाने में मदद कर सकते हैं

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