执行传递给 st(简单终端)的 -e 标志的分号分隔命令

执行传递给 st(简单终端)的 -e 标志的分号分隔命令

笔记: st是我的问题中终端模拟器的实际名称 -https://st.suckless.org/


我想创建一个快捷方式,如果按下该快捷方式,则会弹出并显示剪贴板中单词的翻译。

我尝试使用它,但立即退出并给出错误:

$ st -e "trans $(xclip -o) -t en; read"`
child finished with error '256'

但同样适用于xterm预期:

$ xterm -e "trans $(xclip -o) -t en; read"

仅使用一个命令作为-est 的选项,但我需要在 trans 之后执行 read 或类似的操作,这样终端不会立即关闭。

这是 st 的错误还是我做错了什么?

答案1

-e选项是一种兼容性机制简单终端。您传递的命令和参数(有或没有)-e,都会通过简单的终端分叉直接执行,然后跑步execvp()在子进程中确切地说是给出的命令和参数。不涉及 shell,并且传递的参数st完全按原样发送到目标程序。

你已经把所有的事情都当作一个论点来传递了。如此简单的终端实际上​​是在尝试运行一个按字面意思命名的命令trans $(xclip -o) -t en; read(如果使用单引号,或者如果使用双引号,则由扩展结果修改)。显然,您没有名为该命令的命令。

要使用 shell 命令行(例如此处的扩展、shell 内置命令和 shell 命令语法),您必须显式调用 shell 才能理解它:

st -e sh -c 'trans "$(xclip -o)" -t en; read'

这将st启动一个shshell,该 shell 运行一个简短的 shell 脚本,其中包含您的命令。

答案2

查看手册页st

st [-aiv] [-c class] [-f font] [-g geometry] [-n name] [-o iofile] [-T title] 
[-t title] [-l line] [-w windowid] [[-e] command [arguments...]]


-e command [ arguments ... ]
      st executes command instead of the shell.  If this is used it must be 
      the last option on the command line, as in xterm / rxvt. This option 
      is only intended for compatibility, and all the remaining arguments 
      are used as a command even without it.

我同意@Kusalananda 的观点,即此开关仅用于执行单个命令,而不是像您尝试执行的那样复杂。

因此,为此,您需要传递一个 shell 作为参数-est然后将命令作为辅助参数集传递给功能更强大的 shell:

$ st <other args> -e sh -c '....'
$ st <other args> -e bash -c '....'

参考

相关内容