Bash에서 유틸리티에 대한 연쇄 호출 매개변수화

Bash에서 유틸리티에 대한 연쇄 호출 매개변수화

나는 stdin에서 데이터 열을 읽고 이를 처리(평활화 효과 적용)한 다음 stdout으로 출력하는 Bash 셸에 사용되는 블랙박스 UNIX 프로그램을 가지고 있습니다. 예를 들어 UNIX 파이프를 통해 사용합니다.

generate | smooth | plot  

더욱 매끄러워지기 위해 스무딩을 반복하여 Bash 명령줄에서 호출할 수 있습니다.

generate | smooth | smooth | plot   

심지어

generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot

이게 점점 불편해지더군요. smooth출력을 smooth새 인스턴스로 여러 번 파이프 할 수 있도록 Bash 래퍼를 만들고 싶습니다 .

generate | newsmooth 5 | plot

바꾸다

generate | smooth | smooth | smooth | smooth | smooth | plot

내 첫 번째 시도는 Bash 스크립트를 사용하여 현재 디렉터리에 임시 파일을 생성하고 삭제하는 것이었지만 쓰기 액세스 권한이 있는 디렉터리에 없으면 보기 흉해지며 문서가 손상될 때 쓰레기도 남깁니다.

이 프로그램에는 매개변수가 없습니다 smooth.

호출 횟수를 매개변수화하기 위해 이러한 프로그램을 "래핑"하는 더 우아한 방법이 있습니까?

답변1

재귀 함수로 래핑할 수 있습니다.

smooth() {
  if [[ $1 -gt 1 ]]; then # add another call to function
    command smooth | smooth $(($1 - 1)) 
  else
    command smooth # no further 
  fi
}

다음과 같이 사용할 수 있습니다.

generate | smooth 5 | plot

이는 다음과 같습니다.

generate | smooth | smooth | smooth | smooth | smooth | plot

답변2

필요한 명령 수만큼 쉼표를 입력할 수 있으면 smooth셸의 쉼표로 구분된 중괄호 확장을 활용할 수 있습니다.

TL;DR

예제 사례의 전체 명령줄은 다음과 같습니다.

generate | eval 'smooth |'{,,,,} plot

노트:

  • 반복 횟수를 늘리거나 줄이려면 쉼표를 추가하거나 제거하세요.smooth |
  • 중괄호 확장으로 생성된 마지막 문자열 에 포함되어 있으므로 |이전이 없습니다.plotsmooth |
  • smooth여는 중괄호 앞에 인용된 고정 섹션에 적절하게 묶을 수 있는 한 인수를 제공할 수도 있습니다 .모두명령 반복

어떻게 작동하나요?

쉼표로 구분된 중괄호 확장을 사용하면 각각 지정된 고정 부분과 지정된 가변 부분으로 구성된 문자열을 동적으로 생성할 수 있습니다. a{b,c,d}Produce 와 같이 표시된 변수 부분만큼 많은 문자열을 생성합니다 ab ac ad.

여기서의 비결은 목록을 만들고 싶다면비어 있는가변 부분의 경우, 즉 중괄호 안에 쉼표만 있으면 중괄호 확장은 고정 부분의 복사본만 생성합니다. 예를 들어:

smooth{,,,,}

생산할 것입니다:

smooth smooth smooth smooth smooth

알아채다4쉼표는 5개의 smooth문자열을 생성합니다. 이것이 중괄호 확장이 작동하는 방식입니다. 쉼표에 1을 더한 만큼의 문자열을 생성합니다.

물론 귀하의 경우에는 |구분된 모든 항목도 필요하므로 smooth고정 섹션에 추가하기만 하면 됩니다. 그러나 쉘을 얻으려면 올바르게 인용해야 합니다.아니요즉시 설명하세요. 그건:

'smooth|'{,,,,}

생산할 것입니다:

'smooth|' 'smooth|' 'smooth|' 'smooth|' 'smooth|'

고정된 부분은 항상 조심해서 배치하세요여는 중괄호 옆에 있습니다. 즉, ' 및 사이에 공백이 없습니다 {.

(또한 고정 섹션에서 셸 변수를 확장해야 하는 경우 작은 따옴표 대신 큰 따옴표를 사용하여 고정 섹션을 형성할 수도 있습니다. 특정 셸 특수 문자가 이중 따옴표 내에 나타날 때 필요한 추가 이스케이프에 유의하세요. 인용된 문자열).

eval 이 시점에서 문자열을 문자열에 적용하여 쉘이 결국 이를 파이프된 명령으로 해석하도록 해야 합니다.

따라서 요약하면 예제 사례의 전체 명령줄은 다음과 같습니다.

generate | eval 'smooth |'{,,,,} plot

관련 정보