2013-08-04 2 views
4

나는 라 à dialog를 호출 할 : A, BC 제외명령 대체에서 빈 인수를 생존시키는 방법?

dialog --menu Choose: 0 40 10 A '' B '' C '' 

후자는 { echo A; echo B; echo C; }있는이 질문을 위해, 동적 쿼리의 결과입니다.

나는에 의해 겉으로 원하는 명령 줄을 얻을 수 있습니다 :

A '' B '' C '' 

명령 대체의 결과임을 보여

{ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;" 

하지만 :

echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;") 

및 출력 단어 분리 만 가능하지만 ''은 빈 인수로 해석되지 않고 0123으로 전달됩니다.(따라서 dialog은 메뉴 항목에 대한 설명을 표시하지 않지만 문자는 ''입니다).

배열을 사용하여 bash에서이 문제를 해결할 수 있지만 누락 된 간단한 해결책이 있습니까?

$ e() { printf "tag: [$1] item: [$2]"; } 
$ e $(echo "A ''") 
$ tag: [A] item: [''] 

어떻게 항목이 [] 대신 ['']되도록의 $(...) 부분을 변경할 수 있습니다 감안할.

+0

무엇 실제를 문제는 해결하려고합니까? –

+0

@AnsgarWiechers 주어진'{echo A; 에코 B; 에코 C; }', 실행하고 싶습니다'dialog --menu 다음을 선택하십시오 : 0 40 10 A ''B ''C '''. –

+0

* 왜 * 실행하고 싶습니까? 이 일을 통해 무엇을 성취하고 싶습니까? –

답변

1

$ IFS=, e $(echo "a,,") 
tag: [a] item: [] 

가 작동하는 것 같다. 좋은가요? 나는 모르지만 배열 마법을 시도 할 것이다. 그런데 sed 대신에 ${parameter/pattern/string}을 대용으로 사용할 수 있습니다. 불행히도 변수에 대해서만 작동하기 때문에 사용하기가 어렵습니다.

+0

나를 위해 일했습니다. 고마워요. 그러나'dialog '를 호출하기 위해서'IFS'를 별도의 명령으로 설정해야했습니다 ('IFS =, dialog'가 작동하지 않았습니다). 결국 SAVEIFS = "$ IFS"; IFS =,; 만약 ! dialog --menu '마운트 할 스냅 샷 선택'0 40 10 $ (sort .snaplist | sed -e 's/$/,, /;'| tr -d \\ n); 다음 [...]' –

0

이 작업을 시도 할 수 있습니다 :

cmd="dialog --menu Choose: 0 40 10 " 
arg="`echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;")`" 
eval "${cmd}${arg}" 

하지만 sed 여기에 필요하지라고 생각합니다. 당신은 간단하게 할 수 있습니다 : 당신은 IFS (내부 필드 분리)를 변경할 수 있습니다

cmd="dialog --menu Choose: 0 40 10 " 
arg="`echo A \'\' B \'\' C \'\'`" 
eval "${cmd}${arg}" 
+0

''sed'가 필요 없다면 문제가 없을 것입니다 :-). 문제는 'A', 'B' 및'C '가 동적 쿼리에서 비롯된 것입니다. –

+0

그래, 명령 대체를 사용하면'arg' 문자열에'A','B' 및'C' 문자를 쉽게 쓸 수 있습니다. –

2

좋은 질문입니다.

이 "간단하게"자격하지만 특정 우아함이 있는지 모르겠어요 :

with-tags() { 
    local line 
    if read -r line; then with-tags "[email protected]" "$line" ""; else "[email protected]"; fi 
} 

{ echo A; echo B; echo C; } | 
with-tags dialog --menu Choose: 0 40 10 

그것은 형태 TAG <optional description>의 입력 라인 처리하기 위해 쉽게 확장이다 :

with-tag-lines() { 
    local tag desc 
    if read -r tag desc; then with-tag-lines "[email protected]" "$tag" "$desc"; else "[email protected]"; fi 
} 

{ echo A with optional description; echo B; echo C; } | 
with-tag-lines dialog --menu Choose: 0 40 10