【问题标题】:bash: terminal: command not foundbash:终端:找不到命令
【发布时间】:2016-04-11 02:31:17
【问题描述】:

我正在尝试编写一个 Node.js 脚本,该脚本将在一个新进程、一个新命令窗口中启动一个 Node.js 服务器。

我相信我很接近。我有这个:

var n = cp.spawn('sh', [ 'start-server.sh' ]);

start-server.sh的内容是这样的

#!/usr/bin/env bash
node bin/www

这成功启动了服务器,但它没有打开一个新的终端窗口,所以我看不到生成进程的任何 stdio。

所以我想我应该在bash脚本中打开一个新的终端窗口,然后运行node命令,这样bash脚本的内容就会变成

#!/usr/bin/env bash
terminal -e "node bin/www"

问题是命令行无法识别“终端”。这是为什么?我相信“终端”命令应该默认使用任何程序作为您的默认终端应用程序。

请告知这是否是最好的方法,以及为什么在 OSX 的命令行中可能无法识别“终端”,谢谢!

这就是我的路径

echo $PATH

/Users/amills001c/.rvm/gems/ruby-2.2.1/bin:/Users/amills001c/.rvm/gems/ruby-2.2.1@global/bin:/Users/amills001c/.rvm/rubies /ruby-2.2.1/bin:/Users/amills001c/google_app_engine_stuff/google-cloud-sdk/bin:/usr/local/bin:/usr/local/bin/meteor:/usr/local/redis/bin:/ usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Users/amills001c/golang/bin:/Users/amills001c/apache-maven-3.3 .3/bin:/Users/amills001c/.rvm/bin

【问题讨论】:

  • 您为什么认为terminal 应该运行默认终端?它在任何其他情况下都有效吗?
  • 也许我将 Windows 与 OSX 混淆了,但这是我的印象。但是现在命令行无法识别“终端”。我只想打开任何终端窗口,无论是 OSX 上的默认 bash 终端还是 iterm2/iterm3
  • 在我的 Mac 上的应用程序/实用程序中,我有 terminal.app,我想我可以运行它
  • 我对你的问题感到困惑。您提到了 OSX,但您已将您的问题标记为 linux。其中哪一部分是关于 Linux 的?
  • 另外,这看起来很像XY Problem。您要求我们帮助您实施一个几乎可以肯定不是解决您的潜在问题的最佳方法的解决方案。您是否考虑过使用GNU Screen 或 tmux?或者只是将您的 stdout/stderr 重定向到日志文件?

标签: linux node.js macos bash shell


【解决方案1】:

在 OS X 中,您通常会像这样运行命令:

open -a Terminal.app /path/to/script.sh

这将打开一个新的终端窗口并执行您的脚本。

【讨论】:

  • 这对我有用“open -b com.apple.terminal”,你知道 -a vs -b 选项的用途吗?
  • -a 指定用于打开文件的应用程序,-b 指定应用程序在打开文件时使用的包标识符。它们本质上只是指定应用程序打开文件的两种不同方式。
  • 是的,第一部分有效(打开-a Terminal.app),但它似乎没有执行脚本。该脚本独立运行,所以有些奇怪,但谢谢,这有帮助
  • 如果脚本没有执行,也许可以尝试对你的脚本执行 chmod:(例如chmod +x script.sh)。同样在 OS X 中,我的脚本头通常是这样的:#!/bin/bash
  • 这种工作,但我发布了我自己的问题的答案,似乎工作得更好
【解决方案2】:

检查系统中“终端”命令的真实名称,检查它,例如在Ubuntu中执行“/usr/bin/env | grep terminal”,在我的情况下是“gnome-terminal”,然后使用“gnome-terminal -e XXX”应该可以。希望对J有帮助。

【讨论】:

  • 该问题要求 OSX 终端窗口,这不是 Ubuntu 相关问题。
【解决方案3】:

对我有用的是:

var cp = require('child_process');

cp.spawn('sh', [ 'start-server.sh' ], {
            detached: true,
            env: {
                NODE_ENV: process.env.NODE_ENV
            }
        });

#!/usr/bin/env bash    (start-server.sh)
open "./run-node.sh"

#!/usr/bin/env bash    (run-node.sh)
node ./bin/www.js

open 命令将使用默认应用打开 .sh 文件,这对我来说恰好是 iterm2,而不是 terminal.app

我遇到的下一个问题是我必须将路径作为参数传递给 .sh 文件,但我还不知道该怎么做

【讨论】:

  • 是的,可能不会,如果您能建议如何在 linux 上创建一个快速而肮脏的解决方案来帮助我
  • 取决于您的桌面环境。正如其他人所建议的那样,gnome-terminal 如果您使用的是 Gnome,则会启动一个终端。您可以尝试将gnome-open 作为 OSX 的open 的替代品。但如果您的 Linux 桌面环境是 KDE 或 Afterstep 或平铺窗口管理器,这些将不起作用。如果你想要一些真正独立于平台的东西,除非你只使用文本并使用 GNU Screen,否则你可能会不走运。
猜你喜欢
  • 2012-04-11
  • 2014-12-29
  • 2018-12-10
  • 2012-01-09
  • 2013-10-30
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多