2012-06-18 4 views
0

bash 스크립트에서 실행하려는 명령이 들어있는 문자열이 있습니다. 어떻게해야합니까? 정말 기본적인 질문에 대해 유감이지만 저는 bash를 처음 접했습니다. 이 내 코드입니다 :bash에서 문자열로 명령 실행

echo "What is the path to save the result files?" 
read out_path 

end_cm1=$"fastqc -o "$out_path$" --noextract -fastq "$files1 

그리고 나는 end_cm1 변수에있는 명령을 실행합니다.

+1

왜 하시겠습니까? [BashFAQ/050] (http://mywiki.wooledge.org/BashFAQ/050)을 참조하십시오. –

답변

3

첫째, 당신은 모든 문자열에 해당 명령을 넣을 필요가 없습니다 : 당신은 그냥이 작업을 수행 할 수 있습니다

fastqc -o "$out_path" --noextract -fastq $files1 

(그리고 경로는이 경우에 여기에 따옴표로 $out_path을 넣어 권 해드립니다 변수가 복수형이기 때문에 $files1을 따옴표로 묶지 않았으므로 두 개 이상 있다고 가정하고 그 파일 이름에도 공백을 두어야합니다.)

두 번째로 질문에 대한 답변 eval :

eval $end_cm1 
+0

여기서'eval'은 불필요합니다; 'x = "echo bob"; $ x' – chepner

+0

사실, 여기가 사실 일 수도 있습니다. 그러나 당신은 그 문제를 복잡하게 만들고 있습니다. – ams

+0

가능할 때마다'eval'을 피하십시오. 이상한 버그의 근원지로 명성이 있습니다. 이 변수를 사용해야하는 경우 변수 (예 :'eval "$ end_cm1"')를 큰 따옴표로 묶으십시오. 느슨하게 말해서,'$ end_cm1'은 실행하기 전에 정상적인 파싱의 전부는 아니지만 일부를 수행합니다. 'eval $ end_cm1'은 파싱을하고 * 다시 파싱합니다 *; 'eval "$ end_cm1"은 정확히 한 번 구문 분석합니다. 더 나은 대안은 Dennis의 링크를 참조하십시오. –

0

당신은 당신의 문자열에 약간의 구문 문제가 :

end_cm1="fastqc -o $out_path --noextract -fastq $files1" 
$enc_cm1 

이 @ams했다 가졌 것은 처음의 문자열이 를 할당 할 필요가 없습니다에 대한 권리, 그리고 위험에 대한 참여 (인용 부호가 없음) $files1.

+0

특히, 추가 인용 수준이 있거나 확장되지 않은 변수가'$ end_cm1' 안에 있으면 * 필요 *'eval'이 필요합니다. 인용 부호가없고 변수가 없다면'eval'은없는 경우와 똑같이 작동합니다. 나는 그것을 사용하는 것을 선호하므로 내가하는 일을 알고있다. 사용자 입력이 평가되는 무언가를 가질 위험이 있다는 것을 알고 있어야합니다 (두 옵션 중 하나를 사용하여). 시스템을 해킹하기 위해 악용 될 수있는 스크립트에서 그렇게하지 마십시오! – ams