2013-06-28 4 views
0

Я создал функцию проверки наличия файла на удаленном сервере, но я получаю сообщение об ошибке «ssh: command not found» при попытке вызвать функцию , Вот функция:Функция bash «команда не найдена»

remote_file_exists() { 
    local SERVER="$1" 
    local PATH="$2" 
    local FILE="$3" 
    FILE_EXISTS=`ssh "$SERVER" \'find "$PATH" -name \"$FILE\"\'` 
    if [ -z $FILE_EXISTS ]; then 
     return 1 
    else 
     return 0 
    fi 
} 

Я вызываю функцию:

if (remote_file_exists $REMOTE_SERVER "$REMOTE_PATH/" $REMOTE_FILE); then 
    echo "$REMOTE_PATH/$REMOTE_FILE exists on $REMOTE_SERVER" 
... 

Ошибка я получаю:

myscript.sh: line x: ssh: command not found 

Значение 'х' в ошибке - номер строки строки в функции, начинающейся с «FILE_EXISTS =».

Я подозреваю, что это связано с неправильным цитированием, но я не могу понять это. Что я делаю не так?

EDIT: Благодаря Cfreak для хорошего улова по имени переменной PATH. После того, как я установил, что я получил другую ошибку:

bash: find <MYPATH> -name "<FILE>": No such file or directory 

После нескольких экспериментов я обнаружил, что удаление сбежавших одиночные кавычки закрепил 2-й выпуск. Рабочая линия выглядит следующим образом:

FILE_EXISTS=$(ssh "$SERVER" find "$MYPATH" -name \""$FILE"\") 
+0

Вы пытались использовать полный путь i.e./ usr/bin/ssh? – ghm1014

+0

Не связанный с вопросом, но вы должны поместить '$ FILE_EXISTS' в двойные кавычки, так как он может содержать пробелы. – Barmar

+0

Не связанный, но используйте '$ (ssh ...)' вместо обратных запросов. Это намного безопаснее и гнездо ... – jm666

ответ

0

Попробуйте это. (Я переключился _ к - для облегчения ввода, и `` до $(), но это не обязательно)

remote-file-exists() 
{ 
    local SERVER="$1" 
    local MYPATH="$2" 
    local FILE="$3" 
    local FILE_EXISTS="$(ssh "$SERVER" find "'$MYPATH'" -name "'$FILE'" -print)" 
    if [ -z "$FILE_EXISTS" ]; then 
     return 1 
    else 
     return 0 
    fi 
} 

Вы могли бы сократить это существенно. Кроме того, локальные переменные обычно уменьшаются, чтобы исключить, что они являются переменными среды:

remote-file-exists() 
{ 
    local server="$1" mypath="$2" file="$3" 
    [ ! -z "$(ssh "$server" find "'$mypath'" -name "'$file'" -print)" ] 
} 
+0

Спасибо! Мне очень нравится сокращенная версия. – clarkcb

1

PATH переменная, которая управляет, где Баш находит команды, и вы ее сброса. Измените имя переменной PATH.

remote_file_exists() { 
    local SERVER="$1" 
    local MYPATH="$2" 
    local FILE="$3" 
    FILE_EXISTS=`ssh "$SERVER" \'find "$MYPATH" -name \"$FILE\"\'` 
    if [ -z $FILE_EXISTS ]; then 
     return 1 
    else 
     return 0 
    fi 
} 
+0

Очень хороший улов. – hobbs

+0

Согласен, это был отличный улов. Теперь я получаю другую ошибку: «bash: find -name« »: Нет такого файла или каталога». Я думаю, что это происходит с удаленного сервера. – clarkcb

+0

BTW, я знаю, что MYPATH существует на удаленном сервере, поэтому я уверен, что это не проблема. – clarkcb