笔记: 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"
仅使用一个命令作为-e
st 的选项,但我需要在 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
启动一个sh
shell,该 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 作为参数-e
,st
然后将命令作为辅助参数集传递给功能更强大的 shell:
$ st <other args> -e sh -c '....'
$ st <other args> -e bash -c '....'