2015-11-20 7 views
-1

Я написал сценарий оболочки на своем mac. Следующий код:Доступ к файлам Shell Script



    echo [objects] > temp.prj 
    echo $1.obj >> temp.prj 
    chmod 777 temp.prj 
    wla-65816 -o $1.asm $1.obj 
    wlalink -vr temp.prj $1.fig 
    rm $1.obj 
    rm temp.prj 

Проблема заключается в том, что программа wlalink дает мне сообщение об ошибке:

LOAD_FILES: Не удалось открыть файл "temp.prj".

Похоже, что есть проблемы с некоторыми правами. Скрипт создает файл, и в файле есть правильный контент. То же самое с запущенным sudo.

Любые идеи?

+0

Что такое * * разрешения на файл temp.prj? –

+0

777, я меняю их в строке 3 –

+1

Вот что вы пытались установить. Ничего не говорится об этом. Но поскольку ghoti говорит, что это очень плохое разрешение на использование в основном, и проблема почти наверняка не на этом уровне. –

ответ

2

Ошибка, о которой вы описали, не похожа на что-то, что создавала оболочка, но единственным инструментом, который появляется на load, является файл wlalink. Если вы пройдете через строки сценария, набрав каждый из них в командной строке, появится ли такая же ошибка? Если да, то какая строка?

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

  1. Использовать shebang. На вашем компьютере есть несколько интерпретаторов интерпретаторов, и при написании сценария лучше всего указать тот, который вы хотите интерпретировать для своего сценария. Добавьте строку, как #!/bin/sh, в качестве самой первой строки сценария.
  2. Укажите свои переменные и любые специальные символы. Квадратные скобки, например, используются как часть «pattern matching». Если вы хотите убедиться, что ваша строка будет взята буквально, используйте литеральные (одиночные) кавычки, то есть echo '[objects]' > temp.prj
  3. Тест на успех. Если какой-либо шаг в вашем скрипте завершился неудачно, скрипт будет продолжать работать до конца, даже несмотря на то, что они гарантированно потерпят неудачу. Добавьте set -e в верхней части скрипта для простой версии этого.
  4. Не используйте глупые разрешения. chmod 777 означает, что файл может быть прочитан, записан и исполнен миром. Это не исполняемый файл. И это, безусловно, не обязательно должно быть доступно для всего мира. Подумайте о том, что вам нужно, и установите разрешения для файлов не более.

После очистки и, особенно, с помощью некоторой базовой обработки ошибок отладка, без сомнения, будет проще.

#!/bin/sh 

if [ -z "$1" ]; then 
    echo "ERROR: I need an option." >&2 
    exit 1 
fi 

# Debugging 
set -e # stop on error 
set -x # display our commands 

echo "[objects]" > temp.prj 
echo "$1.obj" >> temp.prj 
chmod 640 temp.prj 
wla-65816 -o "$1.asm" "$1.obj" 
wlalink -vr temp.prj "$1.fig" 
rm -f "$1.obj" temp.prj 
+1

Еще лучше, используйте 'temp_file = $ (mktemp)' для создания временного файла, а затем используйте 'echo '..."> "$ temp_file" 'при необходимости. 'mktemp' является безопасным в том смысле, что он создает файл с разрешением 640, а не создает его с менее безопасными разрешениями, а затем меняет его, что оставляет небольшое окно для злоумышленника для изменения содержимого. (Наверное, здесь не проблема, но это хорошая практика.) – chepner

+0

@chepner Абсолютно, но ... маленькие шаги. :-) – ghoti

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