명령의 출력을 파일 입력인 것처럼 리디렉션합니다.

명령의 출력을 파일 입력인 것처럼 리디렉션합니다.

grep나중 명령 이나 head다른 명령으로 전달되는 이전 명령의 일부를 변경하려면 항상 명령줄에서 화살표를 위쪽으로 돌려야 한다는 것을 알게 되었습니다 .

간단한 예를 들어보겠습니다. dmesg주어진 문자열을 검색하고 해당 문자열의 마지막 5개 항목만 검색합니다.

나는 이렇게 할 것이다:

dmesg | grep -i USB | tail -n 5

그러나 검색어나 검색 중인 내용이나 소스를 변경하려면 커서가 해당 줄의 해당 부분으로 돌아갈 때까지 기다립니다. 위의 예가 다음과 같이 표현될 수 있도록 줄 끝으로 옮기고 싶습니다. (나는 이것이 틀렸다는 것을 알고 있습니다.)

tail -n 5 < dmesg | grep -i USB(그러면 검색할 수 있어요 sda)

내가 말했듯이, 이것은조잡한예를 들어, 내가 하고 싶은 일을 제안하지만 실제로는 내가 하고 싶은 일이 아닙니다. 이것은 dmesgand의 사용에 관한 것이 아니라 이러한 프로그램 간에 상호 작용하는 방법과 "변수"를 끝에 넣는 방법에 관한 것입니다.greptail

이는 DNS 쿼리의 조회 시간을 가져옴으로써 더 자세히 예시될 수 있습니다.

dig google.com | grep msecgoogle.com( 다른 도메인을 테스트할 수 있도록 끝으로 이동하겠습니다 ) 통과
grep msec < dig google.com

다시 말하지만, 나쁜 예입니다. 내가 더 많이 말하는 것은 여러 프로그램 간에 입력/출력이 흐르는 경우입니다.

나는 파이프와 리디렉션에 대해 기본적으로만 이해하고 있음을 인정합니다. 이는 다음과 같이 요약할 수 있습니다.

  • 파이프( |)stdout한 프로그램의 입력을 stdin다른 프로그램의 입력으로 사용
  • 리디렉션( >)프로그램을 가져와 stdout파일에 입력합니다(여담: 내가 생각할 수 있는 유일한 확실한 장소가 아닌 다른 곳으로 리디렉션할 수 있나요?
    > /dev/null 또는
    > /dev/sda 또는
    > {said file}
    하지만관로프로그램 출력은 프로그램 입력으로 왼쪽에서 오른쪽으로 진행됩니다.
  • 리디렉션( <) (저는 이것을 "입력 파일"이라고 부릅니다)파일의 내용을 가져와 마치 명령줄에 입력한 것처럼 사용하세요.

답변1

(bash, ksh, zsh)를 지원하는 쉘에서는 <()변환할 수 있습니다.

$ cmd1 | cmd2 

입력하다

$ cmd2 < <(cmd1)

두 개는 파이프 측면에서 동일해야 합니다. (단, 두 형식이 프로세스 그룹이나 신호 등을 처리하는 방식에는 약간의 미묘한 차이가 있다고 생각합니다.)

명령줄 편집을 더 잘하려면 셸 도구를 살펴보는 것이 좋습니다. 예를 들어, bash를 사용하면 set -o vivi와 유사한 단축키를 사용하거나 vim보다 효율적으로 편집 명령으로 직접 전환할 수 있습니다. set -o emacsemacs 단축키는 기본적으로 사용됩니다( man bash자세한 내용은 readline을 검색하세요( /readline)).

답변2

나는 종종 같은 일로 인해 짜증을 내는데, 이를 처리하는 몇 가지 방법이 있습니다.

  1. 그냥 받아들이십시오. 때로는 문제를 해결하는 데 시간을 들일 가치가 없습니다.

  2. PSkocik이 언급했듯이 예를 들어 다음을 사용할 수 있습니다.tail -n 5 <(dmesg | grep USB)

  3. 쉘의 편집 기능을 더 능숙하게 사용하십시오. 예를 들어 bash(및 readline을 사용하는 다른 많은 프로그램)에서 이를 사용하여 CtrlA줄의 시작 부분으로 이동하고 "단어"를 앞뒤로 이동 ESCf하고 현재 줄을 편집할 수 있습니다. $ 편집에서(예 : )ESCbCtrl-XCtrl-Evim

더 많은 편집 명령을 사용할 수 있으며 readline.info 파일에 완전히 문서화되어 있습니다. Debian 시스템에서는 이 readline-doc패키지를 설치하세요. 다른 배포판에는 readline 패키지 자체에 문서가 포함되어 있거나 Debian처럼 별개일 수 있습니다.

또한 Lynx와 유사한 경험을 위해 Lynx 웹 브라우저를 설치하고 사용하는 것이 좋습니다 pinfo(제 생각에는 GNU info브라우저가 끔찍하고 거의 사용할 수 없습니다). 배포판에 아직 없는 경우 다음을 수행할 수 있습니다.http://pinfo.alioth.debian.org/

  1. readline일부 사람들이 선호하는 vi편집 모드(기본값은 유사한 모드) 도 있습니다 .emacs

  2. 간단한 경우에는 빠른 바꾸기를 사용할 수 있습니다. 예를 들어 마지막으로 입력한 명령이 다음과 같은 경우입니다.

dmesg | grep -i USB | tail -n 5

^USB^sda^Enter그러면 입력으로 인해 실행이 발생합니다.

dmesg | grep -i sda | tail -n 5

이에 대한 자세한 내용은 , 특히 섹션을 참조 man bash하고 검색하세요 .HISTORY EXPANSIONEvent Designators

그렇습니다. 이 작업을 반복적으로 수행하는 것도 짜증나는 일이 될 수 있습니다.

  1. 더 복잡한 경우에는 길고 복잡한 명령 파이프라인을 사용하는 대신 원하는 작업을 수행하고 실행하는 셸 스크립트나 함수를 작성하는 것이 가장 좋습니다.

예를 들어, 다음과 같은 이름의 쉘 스크립트를 작성하십시오 dmesg-grep.

#! /bin/bash

# regexp to search for is arg 1.  needs to be an extended regexp
# because we're using grep -E aka egrep.
re="$1"

# number of lines to output is optional arg 2 (default 5)
lines=${2:5}

dmesg | grep -iE "$re" | tail -n "$lines"

dmesg-grep usb그런 다음 또는 를 실행할 수 있습니다 dmesg-grep sda.

이 작업을 자주 수행하는 경우 bin홈 디렉터리에 하위 디렉터리를 만들고 이를 ~/bin기본 경로(예: in ~/.bash_profile또는 ~/.bashrc)에 추가하고 그 안에 스크립트를 저장하세요.

답변3

이것이 부수적인 대답이라고 생각할 수도 있지만 해결책은 명령줄에서 단순히 변수를 사용하는 것인 경우가 많습니다. 이는 쉘 스크립트에만 적용되는 것이 아닙니다. 예를 들어 시행착오를 통해 복잡한 "한 줄짜리"를 개발 중이며 다음과 같습니다.

 $ some complex command using value 23 at this point

그런 다음 명령줄 중간에 있는 값 하나만 변경하려고 합니다. 한 번 편집하면 추가 편집 없이 해당 라인을 쉽게 호출할 수 있습니다.

 $ a=23
 $ some complex command using value "$a" at this point
 $ a=37
 $ some complex command using value "$a" at this point
 $ a=42
 $ some complex command using value "$a" at this point

$a디렉터리나 파일 이름과 같이 명령에 두 개 이상의 위치가 필요할 때 더 좋습니다.

관련 정보