Jak mogę skopiować dane wyjściowe polecenia bezpośrednio do mojego schowka?

527

Jak mogę przesłać dane wyjściowe polecenia do mojego schowka i wkleić je z powrotem podczas korzystania z terminala? Na przykład:

cat file | clipboard
Legenda
źródło
możliwy duplikat
potoku
możliwy duplikat superuser.com/questions/104981/...
Champ
Właśnie zadałem powiązane pytanie, ponieważ nie mogę uruchomić XClip podczas logowania do Ubuntu z Git Bash w systemie Windows: stackoverflow.com/q/60117294/470749
Ryan
1
Zapisz zawartość pliku do schowka. apt install xclipicat file | xclip -sel clip
EsmaeelE

Odpowiedzi:

596

Zawsze chciałem to zrobić i znalazłem przyjemny i łatwy sposób. Zapisałem całą procedurę na wypadek, gdyby ktokolwiek jej potrzebował.

Najpierw zainstaluj program 16 kB o nazwie xclip:

sudo apt-get install xclip

Następnie możesz xclipprzesłać dane wyjściowe do skopiowania do schowka:

cat file | xclip

Aby wkleić właśnie skopiowany tekst, użyj:

xclip -o

Aby uprościć życie, możesz ustawić alias w pliku .bashrc tak jak ja:

alias "c=xclip"
alias "v=xclip -o"

Aby zobaczyć, jak to jest użyteczne, wyobraź sobie, że chcę otworzyć moją bieżącą ścieżkę w nowym oknie terminala ( w niektórych systemach mogą istnieć inne sposoby, takie jak Ctrl+ T, ale to tylko w celach ilustracyjnych):

Terminal 1:
pwd | c

Terminal 2:
cd `v`

Zwróć uwagę na ` ` okolicę v. Wykonuje się vto najpierw jako polecenie, a następnie zastępuje je w miejscu cddo użycia.

Kopiuj tylko zawartość do Xschowka

cat file | xclip

Jeśli chcesz wkleić w innym miejscu niż Xaplikacja, spróbuj tego:

cat file | xclip -selection clipboard
Legenda
źródło
143
„plik kota | xclip” kopiuje zawartość tylko do schowka „X”, jeśli chcesz wkleić gdzie indziej niż aplikację „X”, wypróbuj ten: „plik kota | xclip - schowek wyboru”
khotyn
5
Twój wybór uchwytu jest odpowiedni!
Matt Joiner
4
Jeśli chcesz usunąć znak nowej linii, aby móc bezpośrednio wkleić i edytować wynik „pwd | c”, możesz zrobić „pwd | tr -d '\ n' | xclip -selection c”
Anake
12
również definiuj alias "cs=xclip -selection clipboard"i alias "vs=xclip -o -selection clipboard"ułatwiaj kopiowanie / wklejanie ze schowka systemowego
Yibo Yang
1
Co z rozwiązaniem, w którym nie mam dostępu sudo, a xclip nie jest zainstalowany?
DanGordon,
179

W systemie OS X użyj pbcopy; pbpasteidzie w przeciwnym kierunku.

pbcopy < .ssh/id_rsa.pub
DavidPhillipOster
źródło
14
Tak! Tak jak na przykład:pbcopy < .ssh/id_rsa.pub
doublejosh
nie działa na wyjście polecenia tho - nppbcopy < git merge-base master some-branch
Ben
jeśli używasz tmux, nie będzie działać, chyba że ponownie przyłączysz sesję: superuser.com/a/413233/146254
Atav32
1
możesz także użyć cat, jeśli już z nim pracujesz: cat file.txt | pbcopy
rtrigoso
3
Wiem, że komentarz ma 5 lat, ale na wypadek, gdyby ktoś natknął się na to w przyszłości, aby użyć komendy, wykonajgit merge-base master some-branch | pbcopy
Sam
62

Stworzyłem narzędzie dla Linux / OSX / Cygwin, które jest podobne do niektórych z tych innych, ale nieco unikalne. Nazywam to cbi można go znaleźć w tym githubie .

W tym zestawieniu pokazuję, jak kopiować i wklejać za pomocą wiersza poleceń, używając Linuksa, macOS i Cygwin.

Linux

_copy(){
    cat | xclip -selection clipboard
}

_paste(){
    xclip -selection clipboard -o
}

System operacyjny Mac

_copy(){
    cat | pbcopy
}

_paste(){
    pbpaste
}

Cygwin

_copy(){
    cat > /dev/clipboard
}

_paste(){
    cat /dev/clipboard
}

Uwaga: pierwotnie chciałem tylko wspomnieć o tym w moim komentarzu do odpowiedzi Boba Enohpa . Ale potem zdałem sobie sprawę, że powinienem dodać README do mojej treści. Ponieważ edytor treści nie oferuje podglądu Markdown, użyłem tutaj pola odpowiedzi i po skopiowaniu / wklejeniu go do mojej myśli pomyślałem: „Równie dobrze mogę przesłać odpowiedź”.

cb

Trójnik szczelny do schowka

Ten skrypt jest wzorowany na tee(patrz man tee).

To jak normalne polecenia kopiowania i wklejania, ale ujednolicone i zdolne do wyczuwania, kiedy chcesz, aby było łańcuchowe

Przykłady

Kopiuj

$ date | cb
# clipboard contains: Tue Jan 24 23:00:00 EST 2017

Pasta

# clipboard retained from the previous block
$ cb
Tue Jan 24 23:00:00 EST 2017
$ cb | cat
Tue Jan 24 23:00:00 EST 2017
$ cb > foo
$ cat foo
Tue Jan 24 23:00:00 EST 2017

Łańcuch

$ date | cb | tee updates.log
Tue Jan 24 23:11:11 EST 2017
$ cat updates.log
Tue Jan 24 23:11:11 EST 2017
# clipboard contains: Tue Jan 24 23:11:11 EST 2017

Kopiuj przez przekierowanie pliku

(chronologicznie sensowne było pokazanie tego na końcu)

# clipboard retained from the previous block
$ cb < foo
$ cb
Tue Jan 24 23:00:00 EST 2017
# note the minutes and seconds changed from 11 back to 00
Bruno Bronosky
źródło
Działa to idealnie dla mnie, aby skopiować dane wyjściowe polecenia do schowka w terminalu na macOS, dzięki!
Joshua Dyck
46

Napisałem ten mały skrypt, który eliminuje zgadywanie z poleceń kopiowania / wklejania.

Wersja skryptu dla systemu Linux polega na tym, że xclip jest już zainstalowany w twoim systemie. Skrypt nazywa się schowkiem.

#!/bin/bash
# Linux version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if command -v xclip 1>/dev/null; then
    if [[ -p /dev/stdin ]] ; then
        # stdin is a pipe
        # stdin -> clipboard
        xclip -i -selection clipboard
    else
        # stdin is not a pipe
        # clipboard -> stdout
        xclip -o -selection clipboard
    fi
else
    echo "Remember to install xclip"
fi

Wersja skryptu dla OS X opiera się na pbcopy i pbpaste, które są preinstalowane na wszystkich komputerach Mac.

#!/bin/bash
# OS X version
# Use this script to pipe in/out of the clipboard
#
# Usage: someapp | clipboard     # Pipe someapp's output into clipboard
#        clipboard | someapp     # Pipe clipboard's content into someapp
#

if [[ -p /dev/stdin ]] ; then
    # stdin is a pipe
    # stdin -> clipboard
    pbcopy
else
    # stdin is not a pipe
    # clipboard -> stdout
    pbpaste
fi

Korzystanie ze skryptu jest bardzo proste, ponieważ po prostu podłączasz lub wyjmujesz, clipboardjak pokazano w tych dwóch przykładach.

$ cat file | clipboard

$ clipboard | less
Bob Enohp
źródło
3
Używam nazw pbcopyi pbpastew systemie Linux, więc działa zarówno w systemie Linux, jak i OS X.
StackedCrooked
Aby skrypt działał globalnie w Ubuntu: * Zapisz go w ~/.scripts/clipboard * Ustaw, aby był wykonywalny chmod +x ~/.scripts/clipboard dla bash: * dodaj export PATH=$PATH:~/.scriptsna końcu ~/.bashrc dla fish: * dodaj set PATH ~/.scripts $PATHdo ~/.config/fish/fish.config Jeśli któryś z plików lub folderów jeszcze nie istnieje, po prostu je utwórz.
Hokej
2
Możesz również owinąć ten skrypt jako funkcję clipboard(){ ... }i wkleić go do .bashrc
Sebastian Nowak
Jest to bardzo podobne do tego, które stworzyłem, ale zezwalam na tworzenie łańcuchów date | cb | tee -a updates.log. To wysłałoby dane datewyjściowe polecenia do schowka i przekazało je do tee -apolecenia, które dołącza je do pliku i przekazuje dalej stdout. Ale to jest jak „ szczelny trójnik do schowka”, ponieważ jeśli po prostu nie date | cbdostaniesz żadnego wyjścia. I wreszcie robi to również cb > file.txt gist.github.com/RichardBronosky/...
Bruno Bronosky
Jedna sugestia - usuń końcowy znak nowego wiersza, aby uniknąć wykonania polecenia podczas wklejania (np. W przypadku kopiowania wklejania ścieżki). Robię to, zmieniając polecenie xclip -i -selection clipboardnaxargs echo -n | xclip -i -selection clipboard
Ivaylo Strandjev,
23

Dodaj to do ~/.bashrc:

# Now `cclip' copies and `clipp' pastes'
alias cclip='xclip -selection clipboard'
alias clipp='xclip -selection clipboard -o'

Teraz clip p pasty i c klip kopii - ale można to zrobić również bardziej wyszukane rzeczy:

clipp | sed 's/^/    /' | cclip

↑ wcina twój schowek; dobre dla witryn bez { }przycisku przepełnienia stosu

Możesz go dodać, uruchamiając to:

printf "\nalias clipp=\'xclip -selection c -o\'\n" >> ~/.bashrc
printf "\nalias cclip=\'xclip -selection c -i\'\n" >> ~/.bashrc
użytkownik3276552
źródło
Podaj przykład użycia
Ulf Aslak
7

Używam Parcellite i xselaby skopiować ostatnią wiadomość zatwierdzenia z gitmojego menedżera schowka (z jakiegoś powodu xclipnie działa):

$ git log -1 --pretty=%B | xsel -i -b
Michał Przybylowicz
źródło
7

Bez korzystania z zewnętrznych narzędzi, jeśli łączysz się z widokiem serwera SSH, jest to stosunkowo łatwe polecenie:

Z wiersza polecenia systemu Windows 7+:

ssh user@server cat /etc/passwd | clip

Spowoduje to umieszczenie zawartości pliku zdalnego w lokalnym schowku.

(Polecenie wymaga uruchomienia programu Pageant dla klucza lub poprosi o podanie hasła.)

d.raev
źródło
1
@AfshinMoazami, tytuł i samo pytanie są ogólne, tylko tagi wskazują na system unix, a moja odpowiedź dotyczy przypadku, gdy próbujesz uzyskać datę z serwera unix na maszynę z systemem Windows, co może być przydatne dla przyszłych czytelników.
d.raev
1
Pozytywne, ponieważ tak, przydatne dla administratorów Windows, którzy mają tylko Powershell do grania lokalnie (chociaż teraz z faktycznie działającym LSW, mogę wpaść w bash bezpośrednio z Powershell i stamtąd robić moje * nixy rzeczy).
od
echo Hello World | clip
5

W przypadku systemu Mac jest to przykładowy sposób kopiowania (do schowka) wklejania (ze schowka) za pomocą wiersza polecenia

Skopiuj wynik pwdpolecenia do schowka jako

$ pwd | pbcopy

Użyj zawartości schowka jako

$ cd $(pbpaste)
Mcvkr
źródło
3

Zrobiłem małe narzędzie zapewniające podobną funkcjonalność, bez użycia xclip ani xsel. stdoutjest kopiowany do schowka i można go ponownie wkleić w terminalu. Widzieć:

https://sourceforge.net/projects/commandlinecopypaste/

Pamiętaj, że to narzędzie nie wymaga sesji X. Ze schowka można korzystać tylko w terminalu i nie trzeba go wklejać Ctrl+Vani klikać środkowym przyciskiem myszy w inne okna X.

Dirk Duschinger
źródło
3

W systemie Linux z zainstalowanym xclip:

xclip -selection schowek <plik

tristobal
źródło
2

Na podstawie poprzednich postów skończyłem z następującym lekkim aliasem, który można dodać do .bashrc:

if [ -n "$(type -P xclip)" ]
then
  alias xclip='xclip -selection clipboard'
  alias clipboard='if [ -p /dev/stdin ]; then xclip -in; fi; xclip -out'
fi

Przykłady:

# Copy
$ date | clipboard
Sat Dec 29 14:12:57 PST 2018

# Paste
$ date
Sat Dec 29 14:12:57 PST 2018

# Chain
$ date | clipboard | wc
   1       6      29
kornieff
źródło
1

Pochodzę z tłem okrojona KDE i nie mają dostępu do xclip, xsellub innych wymyślnych rzeczy. Mam konsolę TCSH, co gorsza.

Przybory: qdbus klipper xargs bash

Utwórz plik wykonywalny bash foo.sh.

#!/bin/bash
qdbus org.kde.klipper /klipper setClipboardContents "$1" > /dev/null

Uwaga: To musi być bash, ponieważ TCSH nie obsługuje argumentów wieloliniowych.

Po nim następuje alias TCSH w .cshrc.

alias clipboard xargs -0 /path/to/foo

Wyjaśnienie:

xargs -0potoki stdin w jeden argument. Argument ten jest przekazywany do pliku wykonywalnego bash który wysyła „Kopiuj do schowka” wniosek do klipperkorzystania qdbus. Potok do /dev/nullnie ma drukować znaku nowej linii zwracanego przez qdbuskonsolę.

Przykładowe użycie:

ls | clipboard

Spowoduje to skopiowanie zawartości bieżącego folderu do schowka.

Uwaga: działa tylko jako potok. Jeśli chcesz skopiować argument, użyj bezpośrednio pliku wykonywalnego bash .

Ryan Dsouza
źródło
1

Zazwyczaj uruchamiam to polecenie, gdy muszę skopiować moje ssh-key:

cat ~/.ssh/id_rsa.pub | pbcopy

ctrl+v gdziekolwiek indziej.

Yamen Ashraf
źródło
1

na Wayland xcopy nie działa, zamiast tego użyj schowka wl . np. na fedorze

sudo dnf install wl-clipboard

tree | wl-copy

wl-paste > file
Jens Timmerman
źródło
0

Dla tych, którzy używają bash zainstalowanego w systemie Windows (znanym jako Windows Subsystem for Linux (WSL)), próba xclip spowoduje błąd:

Error: Can't open display: (null)

Zamiast tego przypomnij sobie, że podsystem linux ma dostęp do plików wykonywalnych systemu Windows. Możliwe jest użycie clip.exe jak

echo hello | clip.exe

co pozwala na użycie polecenia wklej (ctrl-v).

DFeng
źródło
1
Zauważ, że jeśli xserver (taki jak vcxsvr lub xming) jest zainstalowany w systemie Windows, wyświetlacz jest włączony i xclipboard jest uruchomiony, możesz właściwie używać xclipa.
bitbyte
0

Wystarczy zakryć przypadek krawędzi :) i ponieważ tytuł pytania pyta (przynajmniej teraz), jak skopiować dane wyjściowe polecenia bezpośrednio do schowka.

Często uważam, że przydatne jest skopiowanie danych wyjściowych polecenia po jego wykonaniu i nie chcę lub nie mogę wykonać polecenia ponownie.

W tym scenariuszu możemy użyć gdm lub podobnego narzędzia myszy i wybrać za pomocą myszy. apt-get install gdma następnie kliknięcie prawym przyciskiem myszy lub kombinacje Cntrl + Shift + c oraz Cntrl + Shift + v do skopiowania i wklejenia w terminalu

Lub, co jest dla mnie preferowaną metodą (ponieważ mysz nie może prawidłowo wybrać w jednym okienku, gdy masz wiele okien obok siebie i musisz wybrać więcej niż jedną linię), używając tmux możemy skopiować do bufora tmux przy użyciu standardowego [, spacja, przejdź do wyboru, wprowadź lub możesz wybrać blok kodu. Jest to również szczególnie przydatne, gdy znajdujesz się na jednym z pasów multipleksera cli, np. Tmux ORAZ musisz wybrać wiązkę tekstu, ale nie numery linii (moja konfiguracja vima wyświetla numery linii)

Następnie możesz użyć polecenia:

bufor zapisu tmux - | xclip -i

Możesz oczywiście aliasować to, co lubisz lub wiązać bezpośrednio w pliku konfiguracyjnym tmux

Ma to na celu dać ci konceptualną odpowiedź na ten przypadek krawędzi, gdy ponowne wykonanie polecenia nie jest możliwe. Jeśli potrzebujesz bardziej szczegółowych przykładów kodu, daj mi znać

Twoje zdrowie

George Mohylewski
źródło