내 명령과 출력을 붙여 넣기위한 명령


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

지금 내가 명령을 실행, 사용 screenC-a C-[, 영역을 강조하기 enter에 붙여, 그 버퍼에 복사 vim한 후, 파일에 기록하고 cat그로 pbcopy. 더 좋은 방법이 있어야합니다.

tee내가 입력 할 수 있는 명령에 접두사 a $와 모든 출력을 추가 할 수 있는 명령 이 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
$

이제 붙여 넣은 원본은 내 맥 클립 보드에 있습니다.


이것은 실제로 OS X에만 해당됩니까?
phk

아니. 다른 플랫폼에서 파일에서 클립 보드로 이동하는 데 사용하는 유틸리티는 대체 pbcopy될 수 있으며 동일한 질문입니다.
Paul Tarjan

2
호기심 : 왜 마우스를 사용하지 않습니까?

2
전체 vim 부분을 생략 할 수 있습니다. 간단하게 실행 pbcopy하고 C-a C-]stdin으로 이동하십시오.

마우스가 느리고 텍스트의 여러 화면의 가치가있을 때 잘 작동하지 않습니다 사용 @hop
폴 Tarjan

답변:


10

하나의 옵션은 -x명령을 실행하는 서브 쉘에서 추적 (with ) 을 활성화하는 것 입니다. 이것은 명령을 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흥미로운 접근법입니다. 잘 발견되었습니다!
DopeGhoti

나는 또한 나의 명령도 (바람직하게는 여전히 2 개 개의 다른 스트림에) 인쇄보고 싶어요,하고 싶은 +일을$
폴 Tarjan에게

1
@PaulTarjan : 그런 다음 PS4를 변경하십시오. 예 (필요하지는 않지만 가능한 옵션을 보여줍니다) : PS4='\\$ ${BASH_SOURCE[0]:-inherited}:line ${LINENO}:${FUNCNAME[0]:+${FUNCNAME[0]}(): } '. "\\ $"는 "$"를 첫 번째 문자로 만들고 해당 문자를 반복하여 호출 레벨을 표시합니다. (1 급 $, 2 급 $$ 등)
Olivier Dulac

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

이것은 가깝습니다. 여기에는 내가 원하는 곳에 전체 프롬프트가 포함되어 $ 있으며 하나만 원하는 곳에서 많은 명령을 수행 할 수 있으며 원하지 않는 머리글과 바닥 글을 추가합니다.
Paul Tarjan

1
ANSI 시퀀스를 억제 할 수 있다고 생각하지는 않지만 (설계 상 전체 세션을 캡처하기 때문에) 헤더를 억제 할 수 있습니다. 에 대한 매뉴얼 페이지를 확인하십시오 -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원하는 프롬프트로 bash를 얻는 데 사용할 수 있습니다 . 또는 프롬프트를 ~/.bashrc사용하고 확인하기 위해 사용자 를 편집 할 수 있습니다 script.[ $(ps -o command= -p $PPID) = 'script' ] && PS1='$ '
Eric


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하기 위해 (키보드에 가까운 "명령 V"로)를 복사 클립 보드에 마지막 명령 :

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

클립 보드에 printf후행 줄 바꿈을 포함하지 않으 려면 사용 및 명령 대체를 참고하십시오 history.


0

지금은 명령을 실행하고 화면의 Ca C- [를 사용하여 영역을 강조 표시하고 입력하여 해당 버퍼에 복사합니다.

이미 사용중인 경우 GNU screen외부 도구를 사용하여 선택 항목을 직접 복사 할 수 있습니다. 예를 들어 ~/.screenrcLinux 에서 이것을 추가했습니다 .

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 당신을 위해 작동 할 수 있도록 문제없이.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.