【问题标题】:bash passing strings to "gnome-terminal -e"bash 将字符串传递给“gnome-terminal -e”
【发布时间】:2015-11-23 10:39:45
【问题描述】:

这个问题看起来像Opening multiple tabs in gnome terminal with complex commands from a cycle,但我正在寻找更通用的解决方案。

我有一个 C 程序,它使用参数调用脚本“xvi”。每个参数最初都包含在引号 (''') 中,并且参数中的每个引号都是独立的并带有反斜杠(此格式是先决条件)例如:

xvi 'a file' 'let'\''s try another'

脚本 xvi 必须使用“-e vim args”启动 gnome-terminal

使用 xterm 而不是 gnome-terminal,这很容易,因为 xterm 假定“-e”是最后一个参数并将所有尾部传递给 shell,所以以下是可以的:

exec /usr/bin/xterm -e /usr/bin/vim "$@"

对于 gnome-terminal,“-e”是一个选项,我们需要将整个命令行“打包”在一个参数中。这就是我所做的,没关系:将每个参数括在双引号中(\“arg\”)并反斜杠参数中的任何双引号:

cmd="/usr/bin/vim"
while [ "$1" != "" ] ; do
  arg=`echo "$1" | sed -e 's/\"/\\\"/g'`
  cmd="$cmd \"$arg\""
  shift
done
exec gnome-terminal --zoom=0.9 --disable-factory -e "$cmd"

再一次,这很好用,我对此很满意。

问题:有没有更好的解决方案,避免循环?

谢谢

【问题讨论】:

  • 您无法将复杂的命令稳健可靠地放入 shell 字符串中。有关此问题的讨论,请参阅 Bash FAQ 050。你可以使用-- 或类似的方法告诉gnome-terminal 停止处理参数吗?你能通过标准输入/etc. 用"$@" 给它输入命令吗?

标签: string bash escaping


【解决方案1】:

未经测试,但您可能会说服 printf '%q' 完成这项工作:

exec gnome-terminal --zoom=0.9 --disable-factory -e "$(printf '%q ' "$@")"

【讨论】:

  • 这不起作用。即使是带有空格的简单文件:9829 ? S 0:00 /bin/sh -c xvi 'File 1'9830 ? Sl 0:00 gnome-terminal --zoom=0.9 --disable-factory -e ''
【解决方案2】:

我知道这个线程很旧,但最近我有类似的需求,我创建了一个 bash 脚本来启动多个选项卡并在每个选项卡上运行不同的命令:

#!/bin/bash

# Array of commands to run in different tabs
commands=(
    'tail -f /var/log/apache2/access.log'
    'tail -f /var/log/apache2/error.log'
    'tail -f /usr/local/var/postgres/server.log'
)

# Build final command with all the tabs to launch
set finalCommand=""
for (( i = 0; i < ${#commands[@]}; i++ )); do
    export finalCommand+="--tab -e 'bash -c \"${commands[$i]}\"' "
done

# Run the final command
eval "gnome-terminal "$finalCommand

您只需将命令添加到数组中并执行即可。

要点链接:https://gist.github.com/rollbackpt/b4e17e2f4c23471973e122a50d591602

【讨论】:

    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 2023-03-03
    • 2020-06-16
    • 2016-09-15
    • 2016-01-12
    • 2012-06-13
    • 2020-04-08
    • 2016-06-01
    相关资源
    最近更新 更多