Polecenie wklejenia mojego polecenia i jego wyniku

9

Często chcę coś opublikować na błędzie 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

W tej chwili uruchamiam polecenie, użyj screen, C-a C-[aby podświetlić obszar, enterskopiować go do tego bufora, wkleić do vim, zapisać do pliku, a następnie catdo pbcopy. Musi być lepszy sposób.

Czy istnieje polecenie, które mogę uruchomić, do którego wpisuję teepolecenie poprzedzone a $i wszystkimi danymi wyjściowymi pbcopy? A może coś bliskiego? Wyobrażam sobie

$ 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
$

a teraz oryginalna rzecz, którą wkleiłem, znajduje się w moim schowku Mac.

Paul Tarjan
źródło
Czy to naprawdę jest specyficzne dla OS X?
phk
Nie. Każde narzędzie, którego użyjesz do przejścia z pliku do schowka na innych platformach, może zostać zastąpione pbcopyi to samo pytanie.
Paul Tarjan,
2
Ciekawe: dlaczego nie używasz myszy?
2
Możesz pominąć całą część vima. Wystarczy uruchomić pbcopyi C-a C-]do jego standardowego wejścia.
@hop za pomocą myszy działa powoli i nie działa dobrze, gdy tekst ma wiele ekranów
Paul Tarjan

Odpowiedzi:

10

Jedną z opcji jest włączenie śledzenia (z -x) w podpowłoce, która uruchamia polecenie. Spowoduje to zapisanie polecenia do STDERR, a standardowe wyjście do STDOUT. Zbierz oba i potokuj 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
JRFerguson
źródło
set -xto ciekawe podejście. Dobrze zauważony!
DopeGhoti,
Chciałbym również, aby moje polecenie zostało wydrukowane (najlepiej na dwóch różnych strumieniach) i chciałbym +być$
Paul Tarjan,
1
@PaulTarjan: następnie odpowiednio zmień PS4. Exemple (nie to, czego potrzebujesz, ale pokazuje kilka możliwych opcji) PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. „\\ $” czyni „$” pierwszym znakiem, a następnie ten znak jest powtarzany, aby pokazać poziom wywołania. ($ za pierwszy poziom, $$ za drugi poziom itp.)
Olivier Dulac
7

Za pomocą tego scriptnarzędzia można przechwycić całą interakcję, w tym monit, polecenie i jego wynik:

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

Następnie możesz przejrzeć plik, a jego zawartość będzie już w schowku.

Możesz też:

script temp.log 'somecommand'; cat temp.log | pbcopy
DopeGhoti
źródło
To jest blisko Zawierał cały mój monit, w którym chcę tylko, $ i pozwala mi wykonywać wiele poleceń tam, gdzie chcę tylko jedno, i dodaje nagłówek i stopkę, których nie chcę.
Paul Tarjan,
1
Nie sądzę, że może on tłumić sekwencje ANSI (ponieważ z założenia służy do przechwytywania całej sesji), ale można pominąć nagłówek. Sprawdź stronę podręcznika dla -q. Możesz użyć seddo usunięcia kodów ANSI: sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
DopeGhoti
2
Możesz użyć, script temp.log env PS1='$ ' bash --norcaby uzyskać bash z żądanym monitem. Alternatywnie możesz edytować swój, ~/.bashrcaby sprawdzić użycie scripti zmienić monit:[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric
1

Na podstawie komentarza do innej odpowiedzi nie chcesz, aby cały monit był kopiowany, ale tylko $.

Jak to rozwiązać, po prostu:

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

Łatwy. Następnie używam myszy do kopiowania i wklejania żądanego polecenia, polecenia i danych wyjściowych.


W innym przypadku użycia, w którym po prostu chcę, aby polecenie, a nie jego wynik, a nie monit, było w stanie przekazać komuś instrukcje, ustawiłem alias zv(blisko „Command V” na klawiaturze), aby skopiować ostatnie polecenie do mojego schowka :

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

Zwróć uwagę na użycie printfi zastępowanie poleceń, aby uniknąć włączenia końcowego znaku nowej linii historydo schowka.

Dzika karta
źródło
0

W tej chwili uruchamiam polecenie, używam Ca C- [screen, aby podświetlić obszar, wejdź, aby skopiować go do tego bufora,

Jeśli już używasz GNU screen, możesz skopiować zaznaczenie bezpośrednio za pomocą zewnętrznego narzędzia. Na przykład dodałem to do ~/.screenrcsystemu Linux:

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

Teraz mogę zaznaczyć wybór za pomocą Control- a [, naciśnij, Spacea teraz naciśnij Control-, a baby uruchomić xsel. To nie jest mój pomysł, to właściwie dość powszechne . Pamiętaj, że niektóre osoby używają go pbcopyzamiast,xsel więc może działać dla Ciebie bez żadnych problemów.

Arkadiusz Drabczyk
źródło