
때로는 cli 도구를 사용하여 명령줄 스크립트의 출력을 추가로 처리/필터링하고 싶습니다. 시간이 오래 걸리거나 동일한 출력이 다시 생성되지 않기 때문에 명령을 다시 실행할 수 없습니다.
현재는 출력을 텍스트 편집기의 새 파일에 붙여넣고 저장한 다음 cat
cli를 사용하여 tr, sed 및 기타 도구로 파이프합니다. 이것은 번거로운 일입니다.
이러한 유형의 텍스트 처리 작업을 수행하는 더 빠른 방법이 있습니까?
답변1
설명된 것과 똑같은 작업을 수행할 수 있지만 파일이나 편집기를 사용하지 않고도 수행할 수 있습니다. cat
명령에 대한 인수 로 파일 이름을 지정하지 마십시오 . 이는 cat
표준 입력에서 읽는 것을 의미합니다. 그런 다음 필터 파이프라인이 대기 중인 상태에서 텍스트를 터미널에 붙여넣고 CTRL-D
close 를 누르기만 하면 됩니다 cat
.
단점은 필터링된 출력이 입력 텍스트와 혼합된다는 것입니다. 필터가 출력을 일부 파일에 저장해도 문제가 되지 않습니다.
답변2
사용 사례가 충분히 구체적이지 않지만 Bash를 사용하는 것이 문제가 되지 않는다면 다음과 같은 이점을 누릴 수 있습니다.프롬프트 명령.
PROMPT_COMMAND='touch ~/.last_command_output; LAST_COMMAND_OUTPUT="$(cat ~/.last_command_output)"; exec >/dev/tty; exec > >(tee ~/.last_command_output)'
이제부터 $LAST_COMMAND_OUTPUT
이전 명령의 출력을 포함해야 하는 변수를 사용할 수 있습니다.
뒤에서 무슨 일이 일어나는지:
PROMPT_COMMAND
BASH가 프롬프트를 표시하기 전에 실행되는 명령을 정의하는 변수입니다(대부분의 경우 마지막 명령이 작업을 완료합니다).touch ~/.last_command_output;
~/.last_command_output
- 나중에 저장 목적으로 사용할 파일을 만듭니다.LAST_COMMAND_OUTPUT="$(cat ~/.last_command_output)"
이전에 언급한 파일의 내용을 이름이 지정된 환경 변수에 저장하므로LAST_COMMAND_OUTPUT
나중에 간단히 에코하면 됩니다.exec >/dev/tty;
-exec
인수 없이는 현재 쉘의 출력을/dev/tty
(현재 터미널 장치)로 리디렉션하는 데 사용됩니다. 이는 터미널에서 이전 명령의 이전 리디렉션을 제거하는 데 필요합니다(다음 항목 참조)exec > >(tee ~/.last_command_output)
- 다음 명령어를 사용하여 실행합니다.tee
(stdin의 내용을 파일 내부에 저장하고 stdout으로 출력합니다.)프로세스 교체따라서 exec는 마치 tee로 파이프된 것처럼 출력을 이 파일 설명자로 리디렉션할 수 있습니다.
이것은 좋은 출발점인 것 같습니다. 그런 다음 마지막 N 명령의 출력을 저장하거나 여러 세션이 명령 출력을 저장하는 데 사용된 파일을 덮어쓰지 않도록 하는 등 몇 가지 추가 기능을 추가할 수 있습니다.
단점도 있습니다. 이러한 방식으로 출력을 리디렉션하면 일부 명령에서 출력이 표준 출력이 아님을 알게 되며 .txt 파일 없이 터미널에서 실행하는 것과 다른 동작을 경험할 수 있습니다 PROMPT_COMMAND
. 색상이 없는 터미널에 이와 같은 것이 있을 수 있지만 ls
각 항목을 한 줄씩 출력하는 대신 한 줄에 목록을 출력합니다. 가장 주목할만한 것은 사용자 입력이 필요한 터미널 프로그램의 문제입니다(예: vi
입력이 터미널이 아니며 $LAST_COMMAND_OUTPUT
변수의 출력이 엉망이라는 경고).
또는 이 기능을 비활성화하면 됩니다 unset PROMPT_COMMAND
.
답변3
다음과 같은 함수로 기존 명령에 대한 호출을 래핑합니다.
doit() {
local ret=0
exec 3>&1 # save fd 1 (stdout) in fd 3 to restore later
exec > >(tee output.txt) # redirect stdout of this script to go to tee
your_command "${@:--}" # run whatever command you want
ret="$?" # save that command's exit status
exec 1>&3; 3>&- # restore stdout and close fd 3
return "$ret"
}
doit
그런 다음 대신 호출하면 나중에 편집할 수 있도록 출력이 your_command
실행되고 your_command
파일에 저장 됩니다 output.txt
. 당연히 함수와 출력 파일에 적절한 이름을 지정하십시오.
답변4
@muru가 제안한 대로 이제 클립보드-쉘 도구를 사용합니다 xsel
.
cli 출력에 추가 수정이 필요하다고 판단되면 ctrl+shift+c를 사용하여 이를 선택하고 클립보드에 복사합니다. 그런 다음 xsel -b
(= )를 사용하여 xsel --clipboard
다른 도구에 표준 입력으로 붙여넣습니다.
$ xsel -b | grep foo | sed s/bar/baz/
이는 설정이 필요 없이 어디서나 작동하는 솔루션입니다.