2016-12-22 1 views
-1

같은 폴더에서 다른 스크립트를 호출하는 bash 스크립트를 작성했습니다. 나는 단순히 주요 스크립트bash에서 다른 스크립트를 추가 할 수 없음

#awk '{print $2}' >> /tmp/lista_pacotes.log adiciona resultado ao arquivo /tmp/tmp_pacotes_adicionados.log 
echo "\nPacotes adicionados até" $(date) "\n" >> /tmp/tmp_pacotes_adicionados.log 

cat /tmp/diferencas.log >> /tmp/tmp_pacotes_adicionados.log 

./email_pacotes.sh 

#adiciona resultados anteriores 
cat /tmp/pacotes_adicionados.log >> /tmp/tmp_pacotes_adicionados.log 
나는 그것이 제대로 작동하고 있다고 생각

./email_pacotes.sh을 넣어이 일을하고있다,하지만 난 다른 이유로 스크립트를 디버깅했고 나는 두 번째 스크립트를 추가하지 않은 발견 처음에는 메인 스크립트를 실행합니다. 내가 스크립트에게 내가 폴더에 넣어 처음 실행할 때

[...] 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
./email_pacotes.sh: 17: ./email_pacotes.sh: [[: not found 
[...] 

이 발생합니다

나는 다음과 같은 메시지를 받고 있었다. 다시 실행하면 메시지가 더 이상 표시되지 않으므로 구문에 문제가 없다고 추측합니다. 또한 권한이있는 것으로 생각할 수도 있지만 두 스크립트를 모두 0777로 변경하고 메시지가 계속 표시됩니다.

정상적인 동작입니까? 무엇이 이것을 일으킬 수 있습니까?

Obs1 : -x 옵션을 사용하여 주 스크립트를 디버깅합니다.

Obs2 : 이제 다른 테스트를 수행했습니다. 동일한 메시지를 계속 던지기는하지만 특정 시점에 마침내 스크립트를 호출합니다. 그래서 아마 파일을 찾거나 예외를 던질 시간일까요?

+1

조건부로 인해 처음 실행되지 않는 구문 일 수 있습니까? 스크립트의 관련 부분을 게시하지 않으면 말할 수 없습니다. –

+0

@martinclayton 스크립트는 정말 크지 만 전혀 조건이 없습니다. 이 명령은 아무런 관련이 없습니다. – EGS

+2

잠재적 인 응답자가 적어도 문맥 상 17 번을 볼 수 있도록 12-22 행을 게시하고 게시하도록 제안하십시오. –

답변

1

오류에서 나는 bash 이외의 쉘로 두 번째 스크립트를 실행하고 있다고 확신합니다. [[ ]] 조건부는 bash (zsh와 다른 쉘)에서 지원되지만 표준이 아니며 지원하지 않는 다른 쉘도 있습니다. 그래서 당신이 그 (또는 다른 비표준 bash 기능들을 사용하기를 원한다면), 그 스크립트에서 적절한 shebang 행을 사용할 필요가 있습니다. 일반적으로 #!/bin/bash (또는 아마도 #!/usr/bin/env bash), 이 아닌#!/bin/sh 인 스크립트를 시작해야한다는 의미입니다.

나를 걱정하는 또 다른 문제가 있습니다. 두 번째 스크립트를 ./email_pacotes.sh과 함께 실행하면 현재 작업 디렉토리에서 첫 번째 스크립트를 실행 한 프로세스에서 상속되며 거의 모든 위치에있을 수 있습니다. 첫 번째 스크립트가 들어있는 동일한 디렉토리에서 두 번째 스크립트를 찾으려면 가장 좋은 방법은 "$(dirname "$BASH_SOURCE")"과 같은 첫 번째 스크립트를 찾는 것입니다 (그리고 아마도 BASH_SOURCE은 bash 전용 기능이기 때문에 bash를 가진 첫 번째 스크립트도).

#!/bin/bash 
... 
scriptDir="$(dirname "$BASH_SOURCE")" 
if [[ ! -d "$scriptDir" ]]; then 
    echo "Something's terribly wrong; I can't find myself!" >&2 
    exit 1 
fi 
... 
"$scriptDir/email_pacotes.sh" 

또는이 스크립트 cd를 자신의 디렉토리에 다음 상대 경로 사용 : 그럼 당신도 명시 적 경로에 의해 두 번째 스크립트 (및 기타 관련 파일)을 참조 할 수 있습니다

#!/bin/bash 
... 
cd "$(dirname "$BASH_SOURCE")" || { 
    echo "Something's terribly wrong; I can't cd to my own directory!" >&2 
    exit 1 
} 
... 
./email_pacotes.sh 

I을 어떤 스크립트가 경로 (예 : 인수)를 받아들이면 사용자는 스크립트 자체가있는 위치가 아닌 스크립트를 실행했을 때의 사용자 위치와 관련하여 해당 경로가 해석 될 것으로 기대하기 때문에 첫 번째 방법을 선호합니다. 스크립트에서 cd이 발생하면이 문제가 해결됩니다.

+0

나는 bash를 사용하고있다. #!/bin/bash로 시작했습니다. 제가 말했듯이 스크립트는 매우 크기 때문에 완전히 게시하지 않았습니다. 내가 언급 한 첫 번째 접근법을 시도 할 것입니다. – EGS

+0

@EGS 두 번째 스크립트를 찾을 수 없다는 것은 여러분이보고있는 오류 메시지를 제공해서는 안됩니다 - 다른 스크립트에서 email_pacotes.sh라는 이름의 * 다른 스크립트에 적절한 스크립트가 없는데 저것 대신에. 이것은 때로는 그냥 작동하기 시작하는 이유를 설명 할 수 있습니다 : 어떤 시점에서 스크립트가있는 디렉토리로 이동하고 갑자기 두 번째 스크립트의 올바른 버전을 찾는 것입니다. –

관련 문제