【问题标题】:Open gnome terminal programmatically and execute commands after bashrc was executed以编程方式打开 gnome 终端并在执行 bashrc 后执行命令
【发布时间】:2010-10-09 16:29:25
【问题描述】:

我尝试构建一个小脚本来启动我的开发环境。对于该任务,我尝试打开一个带有多个选项卡的 gnome 终端,其中自动启动 rails 服务器和自动测试。 但是

gnome-terminal --tab -e "rails server" --tab --tab

不起作用(“创建子进程时出错”)。 还有

gnome-terminal --tab -e "bash -c \"rails server\"" --tab --tab`

不起作用。 有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: bash gnome gnome-terminal


    【解决方案1】:

    这是我们在Superuser 制定的一个不错的技巧

    1. .bashrc 末尾添加eval "$BASH_POST_RC"

    2. 将每个选项卡的 BASH_POST_RC 环境变量设置为您要执行的命令,例如:gnome-terminal --working-directory="/home/zardoz/projects/my_rails_app" --tab -e 'bash -c "export BASH_POST_RC=\"rails server\"; exec bash"' --tab -e 'bash -c "export BASH_POST_RC=\"autotest\"; exec bash"'

    @Gilles:感谢您的解决方案!

    【讨论】:

    • 尝试-e 'env BASH_POST_RC=\"rails server\" bash' 以获得更短的版本。对第二个 --tab -e 参数做同样的事情。
    • 我遇到了类似的问题并尝试了您的技术。有效。谢谢你。我确实注意到命令字符串没有放入终端或历史记录中。有没有办法做到这一点?
    • 我尝试了几分钟的谷歌搜索。变量 BASH_POST_RC 是什么意思?
    【解决方案2】:

    暗中刺探:为您想在选项卡中运行的每个命令创建 shell 脚本,使其可执行,并通过绝对路径调用它们,例如把这个放在/home/zardoz/bin/railsstart

    #! /bin/sh
    exec rails server
    

    chmod +x它,然后做

    gnome-terminal --tab -e /home/zardoz/bin/railsstart --tab --tab ...
    

    如果这不起作用,接下来我会尝试将strace -f -o /tmp/trace.log 粘贴在命令的开头,让它失败,然后挖掘trace.log 以找出实际失败的系统调用以及原因(那里会有大量的垃圾 - 从末尾向后阅读并查找以 E 开头的全大写代码短语,例如“ENOEXEC”、“ENOENT”、“EPERM”等。)

    编辑:以下是在这些脚本之一中提取所有.bashrc 设置的方法:

    #! /bin/bash
    . ~/.bashrc
    exec rails server
    

    注意:您可能需要调整您的.bashrc,使其不会执行某些仅在“真实”交互式 shell 会话中有效的操作。除非您在 rails 启动之前遇到奇怪的错误,否则不要担心这一点。

    【讨论】:

    • 这种方法与我的第二个 gnome-terminal 语句具有相同的缺陷。它确实尝试在该选项卡中运行“rails server”,但没有成功,因为它找不到命令“rails”。该命令仅在执行前正确调用 .bashrc 时出现。使用 gnome-terminal -e 执行命令时,情况并非如此。
    • 尝试让包装脚本运行你的.bashrc,然后 - 见编辑。
    【解决方案3】:

    我假设出现错误是因为在 gnome-terminal 尝试运行 rails 时未设置 PATH。

    为什么不使用 rails 服务器的完整路径,或者创建一个设置 PATH 变量的脚本?

    【讨论】:

    • 还有一些问题。我使用 RVM 来设置整个 Ruby 环境。 RVM 是在 .bashrc 中设置的。所以我必须确保 gnome-terminal -e "command" 首先执行 .bashrc 然后执行命令。
    • 我认为我没有理解您的问题 =/ 您可以让 gnome-terminal 按指定的顺序执行多个命令。可能用 ; 分隔命令将起作用,如果没有,您可以使用 -x 执行该行的其余部分。我有什么问题吗?
    【解决方案4】:

    已经回复,但以防万一,请查看 this gem,它会在 KDE、OSX 和 Gnome 桌面上自动执行终端。

    【讨论】:

      【解决方案5】:

      适用于 ubuntu 16.04

      Ctr+Shift+T

      这将在同一窗口中打开一个新标签。另外,最右侧的标签旁边会出现一个添加更多标签的按钮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        • 2016-04-03
        • 2013-12-29
        • 1970-01-01
        • 2015-10-10
        • 2016-10-09
        • 1970-01-01
        相关资源
        最近更新 更多