Я должен выполнить приложение (msp430-gcc) с помощью относительного пути от make-файла. Проблема - то, что приложение находится в другом ответвлении папки, таким образом, я должен сделать что-то вроде этого:
../../../../tools/msp430/bin/msp430-gcc
Здесь проблема состоит в том, что система не может найти применение. Однако, если я делаю:
cd ../../../../tools/msp430/bin
./msp430-gcc
затем это работает.
Вы знаете, как я мог запустить приложение от своего начального местоположения, не используя "CD"?
Заранее спасибо в течение Вашего времени.
Ключевые слова здесь: выполнение команды с другим рабочим каталогом. Можно погуглить его сами для нахождения большей информации.
Можно назвать его с помощью круглых скобок - ()
$ (cd ../../../../tools/msp430/bin &&./msp430-gcc)
Круглые скобки создадут новую подоболочку для выполнения команд в нем. Эта новая подоболочка изменит каталог и выполнит программу в этом каталоге.
Кавычка от man bash
(list) list is executed in a subshell environment (see COMMAND
EXECUTION ENVIRONMENT below). Variable assignments and builtin
commands that affect the shell's environment do not remain in
effect after the command completes. The return status is the
exit status of list.
где a list
просто нормальная последовательность команд.
Variables in a subshell are not visible outside the block of code in the subshell.
They are not accessible to the parent process, to the shell that launched the
subshell. These are, in effect, local variables.
Directory changes made in a subshell do not carry over to the parent shell.
В заключении: подоболочка будет видеть все переменные от parent shell
, но это будет использовать их в качестве локальных. Изменения, внесенные подоболочкой в переменные не, влияют parent shell
Другое использование метода sh
:
$ sh -c 'cd ../../../../tools/msp430/bin; ./msp430-gcc'
В этом случае sh -c
не породит подоболочку, но создаст собственную новую оболочку. Вот почему это не видит parent shell
переменные. Поэтому помните: если Вы устанавливаете некоторую переменную перед выполнением sh -c
новая оболочка не будет видеть его.
Но существует, также немного путают между использованием одинарных кавычек ''
и двойные кавычки ""
в sh -c
. Посмотрите этот вопрос понять различие, я только покажу мало примера:
$ TEST=test1
$ sh -c 'echo $TEST'
$ sh -c 'TEST=test2;echo $TEST'
test2
после выполнения первой команды ничто не было распечатано. Это - потому что новая оболочка не имеет TEST
переменная, и ''
не расширяться $TEST
.
$ sh -c "echo $TEST"
test1
$ sh -c "TEST=test2;echo $TEST"
test1
здесь первая команда $TEST
был расширен из-за использования ""
, и даже если мы устанавливаем TEST
переменная в новой оболочке $TEST
уже расширенный, и это распечатало test1
sh -c "command"
. Очень полный ответ.''
и ""