Почему я получаю эту ошибку, когда пытаюсь выполнить этот простой скрипт bash?

Я следую этому руководству , чтобы правильно запустить Aptana Studio на моем Ubuntu 14.04:

Итак, я установил Oracle JRE и, наконец, создал этот файл run.sh, который должен выполнить Aptana:

!/bin/bash

export UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

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

andrea@andrea-virtual-machine:~/Programmi/Aptana_Studio_3$ sudo sh run.sh
run.sh: 1: run.sh: !/bin/bash: not found
run.sh: 3: export: /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3: bad variable name

Почему? Что мне не хватает? Как я могу исправить эту проблему?

5
задан 13 April 2017 в 15:24

2 ответа

Должен быть #!/bin/bash. Я также думаю, что у Вас должна быть новая строка в конце export UBUNTU_MENUPROXY=0.

#!/bin/bash

export UBUNTU_MENUPROXY=0 
/home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3
3
ответ дан 13 April 2017 в 15:24

Существует две ошибки. Короче говоря, это - конкретная фиксация, которую я предложил бы (детали следуют):

#!/bin/sh
UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

Плохая строка Hashbang

Как Shutupsquare говорит, Ваша hashbang строка (технические детали) должна запуститься с a #! вместо просто !.

Это вызывает первое из Ваших двух сообщений об ошибках и будет препятствовать тому, чтобы Ваш сценарий был выполнен как ./run.sh, но не причина, которую Вашему сценарию не удается выполнить AptanaStudio3 (потому что hashbang строка не требуется для sh run.sh вызов синтаксиса).

Между прочим, когда Вы работаете sh run.sh, это запускает Ваш скрипт с sh как интерпретатор. Но с hashbang строкой #!/bin/bash, выполнение ./run.sh запустил бы Ваш скрипт с bash как интерпретатор. Этот сценарий ни в коем случае не зависит от расширенных функций bash, и в то время как bashдополнительное использование памяти почти наверняка незначительно для этого приложения, можно все еще хотеть записать hashbang строку так ./run.sh запускает скрипт с sh:

#!/bin/sh

Неправильное использование export

Основная проблема, которая вызывает Ваше второе сообщение об ошибке и является причиной AptanaStudio3 сбои для выполнения, то, что Вы используете export неправильно. export команда не выполняет команды. Таким образом, Ваша команда интерпретируется как сама переменная среды.

  • export может установить и экспортировать переменную среды:

    export NAME=value
    
  • export может также экспортировать переменную среды (с тем, что ее текущее значение):

    export NAME
    

export не принимает NAME=value command или NAME command синтаксис, как бы то ни было.

Принятие Вашей цели должно выполнить команду /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3 с UBUNTU_MENUPROXY переменная определяется и набор к 0, необходимо просто отбросить слово export в целом:

UBUNTU_MENUPROXY=0 /home/andrea/Programmi/Aptana_Studio_3/AptanaStudio3

Это - стандартный способ выполнить команду с измененной средой от оболочки.

Цель export должен экспортировать переменные в среды всех впоследствии запущенных дочерних процессов (т.е. каждая команда, выполненная из Вашего сценария). Так выполнение export UBUNTU_MENUPROXY=0 на его собственной строке, сопровождаемой AptanaStudio3 команда, как Shutupsquare предполагает, будет работать, и иметь тот же эффект и является совершенно хорошим и приемлемым способом сделать это.

Я предпочитаю способ, которым я предложил выше (без export) потому что:

  • Семантически, Ваша цель ничего не состоит в том, чтобы экспортировать, а скорее выполнять единственную команду с измененной средой. Используя export может вызвать беспорядок другим, читающим Ваш сценарий (или себе позже), и поскольку вторичное соображение возможно менее изящно.
  • С export, Вам нужны две команды; с помощью пути без него Вам нужен только один.

Дополнительное чтение: env управляйте работами (вид) способ, которым Вы пытались использовать export

Наконец, существует команда, которая принимает NAME=value command синтаксис. Эта команда env. Нет никакой причины использовать его в этом сценарии оболочки - его функция, в том основном использовании, состоит в том, чтобы обеспечить (часть) питание оболочки в выполнении команды с измененной средой, и Вы уже имеете ту власть.

Однако при некоторых обстоятельствах, за пределами сценариев оболочки, можно найти, что необходимо установить переменную среды для команды и выполнить ту команду (и сделать те вещи в единственной команде). В контекстах, просто с помощью строки VARIABLE=value command не поддерживается, можно использовать:

env VARIABLE=value command

Вам не нужно это здесь все же. Все оболочки стиля Границы (например, sh, dash, bash, ksh, zsh) поддержка VARIABLE=value command.

10
ответ дан 13 April 2017 в 15:24

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

Похожие вопросы: