2014-09-14 4 views
10

골란에서 스크립트 (.sh) 파일을 실행하는 방법을 알아 내려고하고 있습니다. 명령 (예 : os/exec)을 실행하는 몇 가지 쉬운 방법을 찾았지만 전체 sh 파일 (파일이 변수 등을 설정 함)을 실행하는 방법을 찾고 있습니다.골란에서 배쉬 스크립트 실행

표준 os/exec 메서드를 사용하는 것은 간단하지 않습니다. "./script.sh"를 입력하고 스크립트의 내용을 문자열로로드하는 것이 exec 함수의 인수로 작동하지 않습니다. . 이동 프로그램에서

OIFS=$IFS; 
IFS=","; 

# fill in your details here 
dbname=testDB 
host=localhost:27017 
collection=testCollection 
exportTo=../csv/ 

# get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys 
keys=`mongo "$host/$dbname" --eval "rs.slaveOk();var keys = []; for(var key in db.$collection.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`; 
# now use mongoexport with the set of keys to export the collection to csv 
mongoexport --host $host -d $dbname -c $collection --fields "$keys" --csv --out $exportTo$dbname.$collection.csv; 

IFS=$OIFS; 

:

out, err := exec.Command(mongoToCsvSH).Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("output is %s\n", out) 

하는 mongoToCsvSH이 (가) 쉬 경로 또는 될 수 있습니다

예를 들어

이 내가 이동에서 실행하려는 쉬 파일입니다 실제 내용 - 둘 다 작동하지 않습니다.

아이디어를 얻으려면 어떻게해야합니까?

답변

19

당신은에 있습니다

  1. #!/bin/sh (또는 #!/bin/bash 등)로 시작

    .

  2. 실행 파일 (별칭 : chmod +x script)을 만들어야합니다.

이렇게하고 싶지 않으면 스크립트 경로로 /bin/sh을 실행해야합니다.

cmd := exec.Command("/bin/sh", mongoToCsvSH) 
+0

감사합니다. 이게 효과가있는 것처럼 보입니다. 그러나 이제는 다른 문제가 있습니다 - 스크립트를 실행하는 데 약 1 분이 걸리지 만 프로그램은 실행을 마칠 때까지 기다리지 않습니다. 실행은 실제로 아직 작성되지 않은 상태에서 계속됩니다. 어떤 아이디어입니까? – orcaman

+0

@orcaman 어떻게 운영하고 있습니까? 'exec.Command ("/ bin/sh", mongoToCsvSH) .Output()'? – OneOfOne

+0

예. 문제는 다음 shine을 계속하기 전에이 sh가 파일을 보내기를 기다려야한다는 것입니다. – orcaman

1

/bin/sh을 실행하고 스크립트 자체를 인수로 전달해야합니다. 쉘 스크립트를 직접 실행 가능한 것으로 들어