배쉬 스크립트 명령 리디렉션/재사용-다 방향 계층 리디렉션을 수행하는 방법?

StackOverflow https://stackoverflow.com//questions/9697871

문제

명령 리디렉션/재사용을 이해하는 데 어려움을 겪고 있습니다...

나는 거기에 이해 <(...) <(...) 방법론과 $( ... && ... ) 출력을 결합하는 기술.그러나 나는 정말로 완전히 차이가 무엇인지 이해(나는 실현 (...) 그러나 나는 그것이 일반적인 리디렉션 방식에 어떤 영향을 미치는지 확신 할 수 없다)그리고 나는 여전히 예제와 지침을 훑어 본 후 일대다 리디렉션을 수행하는 방법에 관해서는 매우 혼란 스럽다.:
고급 배쉬 스크립팅 가이드 1
고급 배쉬 스크립팅 가이드 2

그것으로 놀러 내 자신의 시도는 대부분"모호한 리디렉션"오류가 발생했습니다.

예를 들어,아래의 의사 코드에서 주어진 하나의 라인어를 하고 싶다고 가정해 봅시다.

    CMD 1 && CMD 2 && CMD 3 --> (1)  
    CMD 4 (1) --> (2)
    CMD 5 (1) --> CMD 6 --> (3)
    CMD 7 (2) && CMD 8 (3) --> (4)
    CMD 9 (2) --> (5)
    CMD 10 (2) (3) -->(6)
    VAR= echo (4) && echo (5) && echo (6)

또는 프로세스 다이어그램으로

CMD 1 +CMD 2 && CMD 3 
    |\
    | ---> CMD 5 ------> CMD 6-----\
    V                     /         V
    CMD 4 ----------------u--------> CMD 10
     | \                  V           /
     |   -------->CMD 7 + CMD 8      /
     V             |                /
    CMD 9          |               /
      \            |              /
       \           V             /
        --------> VAR <----------

출력은 다음과 같이 지정됩니다. -->;다른 작전에서 재사용할 수 있는 저장소는 -->(#);그리고 조합 연산은 &&.

나는 현재 중복 코드없이 한 줄에서이 작업을 수행하는 방법을 전혀 모른다.

나는 강력한 한 라이너를 만들 수 있도록 명령 리디렉션을 진정으로 마스터하고 싶습니다.

바라건대 그것은 충분히 명확합니다...당신이 그들을 필요로하는 경우 나는 명령에 대한 개념 예제의 증거를 가지고 올 수 있지만,의사 코드는 당신에게 아이디어를 제공해야합니다.

도움이 되었습니까?

해결책

귀하의 의견에 대한 답변:

sort <(cd $CURR_DIR && find . -type f -ctime $FTIME) \ 
    <(cd $CURR_DIR && find . -type f -atime $FTIME) \ 
    <(cd $CURR_DIR && find . -type f -mtime $FTIME) | uniq

다음과 같이 쓸 수 있습니다(나는 더 명확하다고 믿는다)

(find . -type f -ctime $FTIME && find . -type f -atime $FTIME \
    && find . -type f -mtime $FTIME) | sort | uniq

주어진 세 가지 프로그램 중 하나는 출력으로"에이"또는"지"를 생성합니다.정렬된 출력과 고유 출력을 하나의 라이너로 포함하는 문자열을 생성합니다:

mkfifo named_pipe{1,2,3}; (echo z ; echo a ; echo z) > named_pipe1 & \
    tee < named_pipe1 >(sort > named_pipe2) | sort | uniq > named_pipe3 & \
    output=$(echo sorted `cat named_pipe2`; echo unique `cat named_pipe3`); \
    rm named_pipe{1,2,3}

생산 sorted a z z unique a z

이 솔루션에 대해 알 수 있는 한 가지는 각 명령 그룹화에는 고유한 줄이 있도록 분할되었다는 것입니다.내가 여기서 얻는 것은 하나의 라이너가 시원할 수 있지만 종종 선명도가 더 좋다는 것입니다.

이 작동 방식에 의한 메커니즘은 티라는 프로그램 및 명명 된 파이프를 사용하는 것입니다.명명 된 파이프는 익명의 파이프와 정확히 같습니다. cat words.txt | gzip,파일 시스템에서 참조할 수 있다는 것을 제외하고는(그러나 실제 데이터는 파일 시스템에 기록되지 않습니다).명명된 파이프에 쓰는 것은 다른 프로세스가 명명된 파이프에서 읽을 때까지 차단됩니다.나는 당신이 그들을 사용하는 방법의 느낌을 얻을 수 있도록 여기에 파이프의 내 사용과 무상했습니다.

다른 사람들이 언급 한 바와 같이 티는 입력을 여러 출력으로 복제 할 수 있습니다.

다른 팁

이 게시물에 문제에 대한 답변의 시작의 어떤 종류가있다:유닉스(또는 윈도우)의(바람직하게는 이름이 지정되지 않은)파이프를 사용하여 한 프로세스의 표준 출력을 여러 프로세스로 어떻게 보낼 수 있습니까?

티를 사용하여>(명령).그러나 당신의 예는 다소 정교하며 명령(유닉스 방식,예!).

내 말은,여러 명령을 순차적으로 실행하는 데 동의하면 더 쉬울 수 있습니다(그러나 더 이상 한 줄이지 않을 것입니다)...

더 복잡한 언어(예:파이썬)로 이런 종류의 표현을 쓰는 것조차도 복잡 할 것입니다.

당신은 해결해야 할 몇 가지 다른 문제가 있습니다.

  1. 다른 여러 명령에 대한 입력으로 필요한 출력이 하나 있습니다.이 문제를 해결할 수 있습니다 tee >(cmd1) | cmd2.이 답변을 참조하십시오: 유닉스(또는 윈도우)의(바람직하게는 이름이 지정되지 않은)파이프를 사용하여 한 프로세스의 표준 출력을 여러 프로세스로 어떻게 보낼 수 있습니까?

    다른 방법은 파일을 만드는 것입니다.나는 보통 최종 스크립트를 디버깅 할 수 있기 때문에 파일 접근 방식을 선호합니다.혼란을 남기지 않으려면 임시 작업 디렉터리를 만들어 함께 삭제합니다 trap "..." EXIT

  2. 여러 명령의 출력을 단일 명령의 입력으로 결합해야 합니다.여기에서 하위 셸을 사용하십시오: ( CMD 1 ; CMD 2 ) | CMD 3 1 과 2 의 출력을 3 의 입력으로 결합합니다.

  3. 당신은 위의 두 가지의 혼합이 필요합니다.당신은 할 수 있습니다 추가 파일 설명자 만들기 그러나 각각은 한 번만 읽을 수 있습니다.사용 cat 그들을 결합하고 tee 복사본을 만들 수 있습니다.

이 모든 것이 가능해야하지만 단점이 있습니다:뭔가 작동하지 않거나 잘못되면,당신은 버그를 찾을 수 없을 것입니다.

따라서:작업 디렉터리를 만들고 파일을 사용합니다.당신이 이것을 넣으면 /tmp,데이터는 디스크에 기록되지 않습니다(현대 리눅스 시스템에서, /tmp 이것은 엄청난 양의 데이터를 가지고있을 때를 제외하고는 파이프처럼 행동 할 것이고 스크립트를 유지 관리 할 수있을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top