2017-07-24 43 views
1

我正在开发一个小型的JS项目并试图获得一个脚本来运行,它编译了一些以我们自己的“语言x”编写的源文件。在两个不同的目录之间运行“<”命令

要运行编译器通常你会使用命令./a.out < source.x它会打印出成功或编译错误等

在现在的情况下,我想两个目录之间的工作,并使用这个命令:

sudo ~/Documents/server/xCompiler/./a.out < ~/Documents/server/xPrograms/source.x

但这不产生输出到终端的所有,并且不影响输出文件。使用<有什么问题吗?我打算稍后在节点服务器中使用它,请参阅child_process.exec

任何帮助将不胜感激,我有点难住。 谢谢。

+2

你不会告诉'a.out'在做什么,也不会说你正在使用哪个shell。回答这个问题是不可能的。这就像你问我“根据祖母的秘方,我今天做了一顿饭,但是它的烹饪方式和我吃的不一样,我做错了什么?” – user1934428

+0

'sudo'?你为什么要以root身份运行你的编译器?这意味着它不会与您在自己帐户下运行的命令一样被调用相同的环境变量。 –

+0

顺便说一句,有两个可能的问题原因,它们都不需要将完全合格的路径传递给''''重定向操作符。 (1)是编译器希望找到相对于当前工作目录的支持文件,但cwd不再是编译器本身所在的目录。 (2)是'sudo'在一个不存在环境变量的环境中运行你的编译器。 –

回答

2

重定向操作符(<>,以及其他类似的)描述要由外壳你的命令运行在所有之前执行操作。因为这些操作是由shell自己执行的,所以它们不太可能以特定于单个命令的方式被破坏:当它们执行时,该命令还没有开始。

有,但是,一些更有针对性的方式您的第一和第二命令不同:

  • 第二(非工作)一个使用完全合格的路径编译器本身。这意味着编译器所在的目录和编译器运行的当前工作目录可能有所不同。如果编译器在相对于其当前工作目录的位置或位置查找文件,则可能会导致失败。
  • 第二个使用sudo来提升权限以运行编译器。这意味着你作为一个不同的用户运行,其中大部分环境变量被清除或修改(除非在交换机中明确列入白名单) - 并且具有广泛的潜在可能性,这取决于编译器对其运行时环境的期望的细节我们可以合理预期在这里诊断。

第一个问题至少可以解决问题。在外壳:

xCompile() { 
    (cd ~/Documents/server/xCompiler && exec ./a.out "[email protected]") 
} 

xCompile < ~/Documents/server/xPrograms/source.x 

使用exec是一个性能优化:它平衡创建通过消耗子shell启动编译器,而不是启动它作为一个子一个子shell新(用括号)的成本。

调用节点child_process.exec(),您可以简单地在cwd参数中传递所需的运行时目录,因此不需要shell函数。

+0

哦,谢谢!我认为这其实是两个问题。编译器在cwd中查找文件,我没有意识到sudo以这种方式工作。这使现在更有意义,我非常感谢帮助。 – Bort

+0

'sudo'必须为了安全原因清除环境变量 - 否则,类似于'LD_PRELOAD'或导出的shell变量可能会改变升级后代码的行为,使得在/ etc/sudoers中列入白名单的命令成为安全突然不那么如此。 –

相关问题