跑步"<"两个不同目录之间的命令

时间:2017-07-24 11:34:33

标签: shell command

我正在处理一个小型JS项目并尝试运行一个脚本,该脚本编译一些用我们自己的语言编写的源文件x"。

要正常运行编译器,您将使用命令./a.out < source.x并且它将打印出成功或编译错误等。

现在,我尝试在两个目录之间工作并使用此命令:

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

但这根本不会产生输出到终端,也不会影响输出文件。我使用<做错了吗?我计划稍后在节点服务器中的child_process.exec中使用它。

任何帮助都会受到赞赏,我有点难过。 感谢。

1 个答案:

答案 0 :(得分:2)

重定向运算符(<>和其他类似的运算符)描述了在运行命令之前由shell 执行的操作。因为这些操作是由shell本身执行的,所以它们不太可能以特定于单个命令的方式被破坏:当它们执行时,命令尚未启动。

然而,您的第一个和第二个命令有一些更相关的方式:

  • 第二个(非工作)使用完全限定路径到编译器本身。这意味着找到编译器的目录和运行编译器的当前工作目录可能不同。如果编译器在相对于其当前工作目录的位置或位置中查找文件,则可能导致失败。
  • 第二个使用sudo升级权限以运行编译器。这意味着您将以不同的用户身份运行,在切换期间清除或修改大多数环境变量(除非在/etc/sudoers中明确列入白名单) - 并且根据编译器对其的预期细节具有广泛的分解能力超出我们可以合理预期在这里诊断的运行时环境。

第一个,至少,是一个解决方案。在shell中:

xCompile() {
  (cd ~/Documents/server/xCompiler && exec ./a.out "$@")
}

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

使用exec是一种性能优化:它通过使用子shell来启动编译器而不是将其作为子进程启动来平衡创建新子shell(使用括号)的成本。

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