2016-12-22 4 views
-1

Я написал сценарий bash, который вызывает другой скрипт в той же папке. Я делаю это, просто поставив ./email_pacotes.sh в главном скриптеНевозможно добавить еще один скрипт в 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: 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, и сообщение сохраняется.

Это нормальное поведение? Что может быть причиной этого?

Обс1: Я отлаживаю основной сценарий, используя опцию -x.

Obs2: Я сделал еще один тест сейчас. Он продолжает бросать одно и то же сообщение, но в определенный момент он, наконец, вызывает скрипт. Так может быть, просто пора найти файл или выбросить исключение?

+1

Может быть, это синтаксис, который не запускается впервые из-за условного? Невозможно сказать, если вы не разместите соответствующую часть скрипта. –

+0

@martinclayton Скрипт действительно большой, но вообще нет никакого условия. Эта команда полностью не связана ни с чем. – EGS

+2

Предложите вам извлечь строки 12-22 и post, чтобы потенциальные ответчики могли хотя бы увидеть строку 17 в контексте. –

ответ

1

Из-за ошибки, я уверен, что вы используете второй скрипт с оболочкой, отличной от bash. Условие [[ ]] поддерживается bash (и zsh и, возможно, некоторыми другими оболочками), но не является стандартным и есть другие оболочки, которые его не поддерживают. Поэтому, если вы хотите использовать это (или любые другие нестандартные функции bash), вам нужно использовать правильную строку shebang в этом скрипте. Как правило, это означает, что вам нужно запустить сценарий с #!/bin/bash (или, может быть, #!/usr/bin/env bash), не с #!/bin/sh.

Есть еще одна вещь, которая меня беспокоит. Запуск второго скрипта с ./email_pacotes.sh будет искать его в текущем рабочем каталоге, который унаследован от процесса, запускающего первый скрипт, и может быть практически где угодно. Если вы хотите, чтобы он искал второй скрипт в том же каталоге, в котором находится первый скрипт, лучший способ - найти первый скрипт с чем-то вроде "$(dirname "$BASH_SOURCE")" (и угадать, что - BASH_SOURCE - это функция только для 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 в другом каталоге, который не имеет надлежащего shebang, и он находит вместо этого. Это может объяснить, почему это иногда просто начинает работать: в какой-то момент вы подключаетесь к каталогу, в котором находятся скрипты, и вдруг он находит правильную версию второго скрипта. –

Смежные вопросы