Ошибка команды в скрипте bash
Я написал скрипт bash. По сути, он получает три пути на основе входных параметров, а затем получает имя / имя файла в пути.
Что-то вроде:
Я предоставляю:
AA=/home/user
Затем он использует команду find, чтобы получить
/home/user/dir2/images/dir/tellmeimage1fun.bin
Наконец, я должен получить tellmeimage1fun.bin в качестве вывода.
Автор сценария:
#!/bin/bash
echo "arg0 n/k/d"
AA=$1
CC=$3
PATH1="`find $AA/dir2/images/dir/ -name *image1*.bin`"
PATH2="`find $AA/dir2/images/dir/ -name *bimage2*.bin`"
PATH3="`find $AA/dir2/images/dir/ -name *cimage3*.bin`"
if [ $CC = "n" ] ; then
PATH=$PATH1
elif [ $CC = "k" ] ; then
PATH=$PATH2
else
PATH=$PATH3
fi
#Getting filename name from path:
IMG="`ls $PATH | cut -d "/" -f6`"
OUTPUT:
/users/prasapat/bin/sl5: line 22: ls: command not found
/users/prasapat/bin/sl5: line 22: cut: command not found
Если я дам полный путь к ls и отрежу, они будут работать. Но я не хочу делать это для всех команд в сценарии. Если я удаляю последнюю строку и отображаю переменную PATH, это вполне нормально. Только после добавления последней команды я вижу проблему.
Пожалуйста, помогите и дайте мне знать, если я сделал очевидную ошибку.
6 ответов
Проблема в том, что вы переопределяете переменную PATH, в которую bash смотрит, чтобы найти двоичные файлы, если вы не используете полный путь при вызове.
Вы должны изменить PATH в вашем bash-скрипте на MYPATH или что-то в этом роде, чтобы он не связывался с уже переменными окружения.
Если вы не знаете, что такое переменная PATH, вы можете посмотреть статью в Википедии.
У меня была эта проблема, оказывается, редактирование скрипта bash с использованием Notepad++ добавляло окончания строки DOS вместо конца строки UNIX. При запуске сценария в среде Linux возникла ошибка "команда не найдена".
Удалось диагностировать проблему, запустив мой скрипт так:
bash -x testscript.sh
Который будет выводить любой вывод компилятора. Выдается сообщение об ошибке:
bash -x testscript.sh
+ $'\r'
: command not found 2:
'estscript.sh: line 3: syntax error near unexpected token `{
Я исправил проблему, изменив форматирование концов строк в Notepad++, чтобы оно было UNIX, а не DOS, для этого выберите "Правка -> Преобразование EOL -> UNIX".
$PATH
переменная - это специальная переменная среды, которая содержит список каталогов, куда должна заглядывать ваша оболочка (в данном случае bash) при вводе команды (например, find
а также ls
.) Просто попробуй echo $PATH
в сценарии или в оболочке, чтобы получить представление о том, как это выглядит (обычно у вас /bin
, /usr/bin
а также /usr/local/bin
там перечислены, может и больше.)
Поскольку вам не нужно переопределять эту переменную в этом конкретном скрипте, вам следует использовать другое имя, чем $PATH
,
$PATH
предопределенная переменная, которая дает каталоги для поиска при поиске исполняемых файлов. Выберите другое имя переменной для вашего скрипта, и все будет в порядке.
Вы используете PATH
это особенное и используется для поиска команд, и именно поэтому ls
не может быть решена. Используйте любое имя, кроме PATH
if [ $CC = "n" ] ; then
MY_PATH=$PATH1
elif [ $CC = "k" ] ; then
MY_PATH=$PATH2
else
MY_PATH=$PATH3
fi
export MY_PATH
IMG="`ls $MY_PATH | cut -d "/" -f6`"
Используйте другое имя переменной, чем PATH
, $PATH
переменная окружения, которая сообщает вашей оболочке, где искать исполняемые файлы (например, вы можете запустить ls
вместо /bin/ls
).