Bash:在新终端中使用参数执行命令

Bash:在新终端中使用参数执行命令,bash,terminal,command,arguments,quoting,Bash,Terminal,Command,Arguments,Quoting,所以我想在bash中打开一个新的终端,并执行一个带参数的命令。 只要我只使用像ls这样的命令,它就可以正常工作,但是当我使用像route-n这样的命令时,带参数的命令就不起作用。 守则: gnome终端——配置文件为Bash-e whoami的窗口 gnome终端--profile=Bash-e route-n的窗口不起作用 我已经试着在命令周围加上“”等等,但仍然不起作用试试这个: gnome-terminal --window-with-profile=Bash -e 'bash -c "r

所以我想在bash中打开一个新的终端,并执行一个带参数的命令。 只要我只使用像
ls
这样的命令,它就可以正常工作,但是当我使用像
route-n
这样的命令时,带参数的命令就不起作用。 守则:

gnome终端——配置文件为Bash-e whoami的窗口

gnome终端--profile=Bash-e route-n的窗口不起作用

我已经试着在命令周围加上“”等等,但仍然不起作用

试试这个:

gnome-terminal --window-with-profile=Bash -e 'bash -c "route -n; read"'
最后的
读取
可防止窗口在执行之前的命令后关闭。当你按键时,它将关闭

如果您想体验令人头痛的问题,可以尝试更多的报价嵌套:

gnome-terminal --window-with-profile=Bash \
  -e 'bash -c "route -n; read -p '"'Press a key...'"'"'
(在以下示例中,没有最终的
读取
。假设我们在配置文件中修复了该问题。)

如果您想打印空行并享受多级转义:

gnome-terminal --window-with-profile=Bash \
  -e 'bash -c "printf \\\\n; route -n"'
同样,还有另一种引用方式:

gnome-terminal --window-with-profile=Bash \
  -e 'bash -c '\''printf "\n"; route -n'\'
变量以双引号展开,而不是单引号展开,因此如果要展开变量,需要确保最外层的引号是双引号:

command='printf "\n"; route -n'
gnome-terminal --window-with-profile=Bash \
  -e "bash -c '$command'"
引用会变得非常复杂。当您需要一些比简单的两个命令更高级的东西时,建议您编写一个独立的shell脚本,其中包含所需的所有可读的参数化代码,将其保存在某个地方,比如说
/home/user/bin/mycommand
,然后简单地调用它

gnome-terminal --window-with-profile=Bash -e /home/user/bin/mycommand

可以使用以下命令启动新终端:

gnome-terminal --window-with-profile=Bash -- \
    bash -c "<command>"
下面介绍如何创建并将其作为命令传递:

cmd="$(printf '%s\n' 'wc -w <<-EOF
  First line of Here document.
  Second line.
  The output of this command will be '15'.
EOF' 'exec bash')"

xterm -e bash -c "${cmd}"

当被引用时,它将参数扩展为单个单词,每个单词由IFS的第一个字符分隔
nohup
&>/dev/null&
仅用于允许终端在后台运行。

请参阅:Awesome bro,它可以工作:顺便说一句,我在配置文件中定义它不关闭,所以我不需要阅读,但很高兴看到它也可以这样工作。只有一个问题:我如何将
printf“\n”
集成到代码中,因此基本上我希望它在执行另一个命令之前打印一个空行,我尝试在
route-n
前面写入它,但它什么也没做。按照您的要求,用
printf\\\\n
编辑。。。引号和转义符往往会在失控的情况下成倍增加……我如何才能向其中添加变量,使其类似于
command=“route-n”
…'bash-c“$command””(再次编辑:)非常感谢兄弟!!!你无法相信你帮了我多大的忙:D,我总是用双引号,这对我来说太完美了:D,谢谢你再次在这里编写文件版本,虽然我已经知道了,但是我的命令太简单了。再次感谢
echo“${cmd}”
不是很好移植。请记住,
$(…)
扩展是使用当前shell运行的,而不是使用bash,因此您不知道是谁实现了
echo
。请参阅[POSIX规范for
echo
]),了解其行为的不确定性/不可靠性。
echo“${@}”
尤其不可靠。由于明显的原因,您无法区分
echo“hello”“world”
echo“hello world”
之间的区别。如果您保证您的外壳是bash或ksh,最好使用
printf“%q'”$@
来形成一个正确引用的命令(
printf-v cmd“%q'”$@)
如果已知它是bash;ksh优化了
cmd=$(printf“%q'”$@)
以避免产生实际的子shell,但bash没有)。谢谢@CharlesDuffy。事实上,这只是在bash中测试的。我将使用不同的shell测试您的解决方案,并相应地更新答案。我建议使用
printf'%s\n'“hello world”“*“bye world”
作为测试中的命令,以便检测到引用/字符串拆分问题。
cmd="$(printf '%s\n' 'wc -w <<-EOF
  First line of Here document.
  Second line.
  The output of this command will be '15'.
EOF' 'exec bash')"

xterm -e bash -c "${cmd}"
nohup xterm -e bash -c "$(printf '%s\nexec bash' "$*")" &>/dev/null &