Ошибка команды в скрипте 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).

Другие вопросы по тегам