我需要使用 makefile 中的相对路径运行应用程序 (msp430-gcc)。问题是该应用程序位于不同的文件夹分支中,因此我需要执行以下操作:
../../../../tools/msp430/bin/msp430-gcc
这里的问题是系统无法找到该应用程序。但是,如果我这样做:
cd ../../../../tools/msp430/bin
./msp430-gcc
那么它就起作用了。
您知道如何在不使用“cd”的情况下从我的初始位置运行应用程序吗?
在此先感谢您的时间。
答案1
这里的关键词是:使用不同的工作目录运行命令。你可以自己去google一下,找到更多的信息。
您可以使用括号来调用它 -()
$ (cd ../../../../tools/msp430/bin &&./msp430-gcc)
括号会创建一个新的子 shell,并在其中执行命令。这个新的子 shell 会更改目录并执行该目录中的程序。
引自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.
其中 alist
只是一个正常的命令序列。
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.
综上所述:子 shell 将看到来自的所有变量parent shell
,但它将把它们用作当地的. 子shell 对变量所做的更改不会影响parent shell
另一种方法使用sh
:
$ sh -c 'cd ../../../../tools/msp430/bin; ./msp430-gcc'
在这种情况下sh -c
不会产生子壳,而是创建自己的新 shell。这就是为什么它看不到parent shell
变量。因此请记住:如果你在执行之前设置了某些变量,sh -c
新 shell 将看不到它。
但也存在一些混淆单引号 ''
和双引号 ""
在sh -c
。请参阅这为了理解差异的问题,我仅举一个小例子:
$ TEST=test1
$ sh -c 'echo $TEST'
$ sh -c 'TEST=test2;echo $TEST'
test2
执行第一个命令后什么都没打印出来。这是因为新 shell 没有TEST
变量,也不''
扩展$TEST
。
$ sh -c "echo $TEST"
test1
$ sh -c "TEST=test2;echo $TEST"
test1
这里第一个命令$TEST
因为使用而被扩展""
,并且即使我们TEST
在新shell中设置变量$TEST
也已经扩展,并且它打印出测试1
来源
- 关于
sh -c "command"
. 非常完整的答案。 - 关于括号
- 相似的问题
- 从 bash 指南关于括号
- 不同之处之间
''
""