使用相对(上层)路径执行命令。使用另一个工作目录

使用相对(上层)路径执行命令。使用另一个工作目录

我需要使用 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


来源

  1. 关于sh -c "command". 非常完整的答案。
  2. 关于括号
  3. 相似的问题
  4. 从 bash 指南关于括号
  5. 不同之处之间''""

相关内容