나는 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 |
- 중괄호 확장으로 생성된 마지막 문자열 에 포함되어 있으므로
|
이전이 없습니다.plot
smooth |
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