2014-01-16 3 views
0

Я создаю несколько небольших тестовых файлов, чтобы начать изучение сценариев bash.Ошибка bash «команда не найдена», хотя команда срабатывает

Один из файлов, которые я создал, выполняет команду rsync. Команда успешно запускается, но строка в скрипте, вызывающая команду, срабатывает, выдает ошибку line 15: =building: command not found, когда сценарий запускается в терминале.

Вот сценарий:

#!/bin/bash 

clear 

cd ~/Desktop 

mkdir -p ./GGERPTTESTINGSANDBOX/source_folder/ 
mkdir -p ./GGERPTTESTINGSANDBOX/target_folder/ 

touch ./GGERPTTESTINGSANDBOX/source_folder/file1.txt 
touch ./GGERPTTESTINGSANDBOX/source_folder/file2.txt 
touch ./GGERPTTESTINGSANDBOX/source_folder/file3.txt 

statement="/usr/bin/rsync -avzh --progress ./GGERPTTESTINGSANDBOX/source_folder/ ./GGERPTTESTINGSANDBOX/target_folder/" 
$statementResult=$($statement) # the error points to this line. 

Как я уже говорил выше, когда я запускаю этот скрипт Rsync прекрасно работает. Я вытащил команду и уволил ее прямо в терминале, и все работает отлично.

Сначала у меня не было полного пути к команде rsync в скрипте, поэтому я добавил, что он думал, что вытащить команду из моей переменной пути может быть проблемой, но она все еще бросает ошибку.

Я также попытался поместить заявление непосредственно в символы $(), а не передавать его через переменную, и ошибка все еще происходит.

Любые идеи о том, что мне не хватает?

+0

Установка переменной в bash -> 'var = $ (command)'. А затем вы можете использовать переменную с '$ var'. – fedorqui

ответ

4

Избавиться от ведущего знака доллара.

statementResult=$($statement) 

Я также рекомендую хранить команды в функциях, а не в переменных.

statement() { 
    rsync -avzh --progress ./GGERPTTESTINGSANDBOX/source_folder/ ./GGERPTTESTINGSANDBOX/target_folder/ 
} 

statementResult=$(statement) 

Функции могут принимать параметры, что позволяет легко вызвать заранее определенную команду с различными аргументами. Когда их параметры правильно цитируются, они могут обрабатывать имена файлов с пробелами и другими необычными, но разрешенными символами.

Например, вы могли бы параметризировать вашу функцию так просто делает rsync и оставляет имена пути к абоненту:

synchronize() { 
    local dir=$1 
    local src=$2 
    local dest=$3 

    rsync -avzh --progress "$dir/$src/" "$dir/$dest/" 
} 

result=$(synchronize ./GGERPTTESTINGSANDBOX source_folder target_folder) 
result=$(synchronize ./GGERPTTESTINGSANDBOX 'from here' 'to here') 

Обратите внимание, как это принимает имена каталогов с пробелами (from here и to here). Это будет очень сложно сделать с переменной, содержащей один и тот же код.

+0

Ах! blergh, я исхожу из php-фона, поэтому мой мозг видел $ statementResult и полностью игнорировал его как вызов содержимого переменной, а не назначение его. Благодаря! (У меня есть 8 минут, пока я не могу отметить это как правильно, я проверю его, как только таймер встанет) –

+0

Кроме того, что является причиной хранения команды в функции, а не переменной? Я не сомневаюсь, что это справедливость, просто хочу учиться. –

+1

@ChrisSchmitz: странности синтаксического анализа оболочки затрудняют получение команды в & из переменной неповрежденной. См. [BashFAQ 50: я пытаюсь ввести команду в переменную, но сложные случаи всегда терпят неудачу!] (Http://mywiki.wooledge.org/BashFAQ/050). –

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