Выполните команду с относительным (верхним) путем. Используя другой рабочий каталог

Я должен выполнить приложение (msp430-gcc) с помощью относительного пути от make-файла. Проблема - то, что приложение находится в другом ответвлении папки, таким образом, я должен сделать что-то вроде этого:

../../../../tools/msp430/bin/msp430-gcc

Здесь проблема состоит в том, что система не может найти применение. Однако, если я делаю:

cd ../../../../tools/msp430/bin
./msp430-gcc

затем это работает.

Вы знаете, как я мог запустить приложение от своего начального местоположения, не используя "CD"?

Заранее спасибо в течение Вашего времени.

2
задан 23 September 2014 в 11:29

1 ответ

Ключевые слова здесь: выполнение команды с другим рабочим каталогом. Можно погуглить его сами для нахождения большей информации.

Можно назвать его с помощью круглых скобок - ()

$ (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


Источники

  1. О нас sh -c "command". Очень полный ответ.
  2. О круглых скобках
  3. Подобный вопрос
  4. От удара ведут о круглых скобках
  5. Различие между '' и ""
5
ответ дан 7 October 2019 в 01:50

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

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