2016-11-10 1 views
0

xargs 다음에는 몇 가지 명령을 따르고 있습니다. 재미있게도 명령이 제대로 작동한다면 stdout으로 보내면됩니다. 변수에 할당하려고하면 변수는 비어있게됩니다.변수에 할당 된 Bash 명령이 비어 있습니다.

$~ ./somescript | grep -f fc.samples | xargs -I {} sh -c "echo {} | tr '/' '\t' | cut -f9;" 
sample1 
sample2 
sample3 
sample4 
sample5 
sample6 
sample7 
sample8 
$~ 

변수에 할당하려고하고 비어 선 결과 에코 : 아래를 참조 나는 그것의 여러 변화를 시도하고 내가 잘못 얻고 무엇을 알아낼 수 없습니다

$~ ./somescript | grep -f fc.samples | xargs -I {} sh -c "sample=$(echo {} | tr '/' '\t' | cut -f9); echo $sample; " 







$~ 

. 누군가 문제를 발견 할 수 있습니까?

감사합니다.

+1

시도해 보셨습니까? 'sample-$ (./ somescript | grep -f fc.samples | xargs -I {} sh -c "echo {} | tr '/' '\ t'| cut -f9;")' –

+0

아니, 내가 그랬어. 아닙니다. 'sample'에 할당하는 아이디어는 나중에 xargs 명령에서 사용하기위한 것입니다. -이 방법이 나에게 도움이되지 않을 것이라고 생각합니다.) – dmeu

답변

2

당신은 그렇지 않으면 $()$sample 부분이 sh -c보다는 현재 쉘에 의해 처리 될 것이라고 sh -c 명령에 대한 $ 문자를 탈출해야합니다.

... | xargs -I {} sh -c "sample=\$(echo {} | tr '/' '\t' | cut -f9); echo \$sample; " 

외부 인용에 작은 따옴표를 사용해도됩니다.

... | xargs -I {} sh -c 'sample=$(echo {} | tr "/" "\t" | cut -f9); echo $sample; ' 
+0

멋지다! 견적 전환 ... 도와 줘서 고마워요! – dmeu

0

sh에 인수 을 통과보다는 동적으로 결과를 포함시켜 쉘 명령을 만들려고하는 것이 좋습니다. (tr의 목적은 foo/bar\tbaz 같은 문자열에 추가 필드를 만들 수있는 경우가 아니면, 당신은 단지 탭의 기본값을 사용하는 대신 필드 구분 기호로 /를 사용하는 cut을 알 수 있습니다.)

# script='sample=$(echo "$1" | cut -d/-f9); echo "$sample"' 

script='sample=$(echo "$1" | tr '/' '\t' | cut -f9); echo "$sample"' 
./somescript | grep -f fc.samples | 
    xargs -I {} sh -c "$script" _ {} 

_은 셸에서 $0을 설정하는 데 사용되는 더미 인수입니다.