Выполнить команды, разделенные точкой с запятой, переданные флагу -e st (Simple Terminal)

ПРИМЕЧАНИЕ: st – это фактическое имя эмулятора терминала в моем вопросе – https://st.suckless.org/ .


Я хочу создать ярлык, который при нажатии выскакивает st и отображает перевод слова в буфер обмена.

Я пытался использовать это, но сразу выходит и выдает ошибку:

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

Но то же самое работает с xterm как и ожидалось:

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

Использование только одной команды в качестве опции -e st работает, но мне нужно выполнить read или что-то подобное после trans, чтобы терминал не закрывался немедленно.

Это ошибка в ST или я делаю что-то не так?

Опция -e – это механизм совместимости в простом терминале . Команда и аргументы, которые вы передаете, с или без -e , выполняются напрямую, с помощью простого разветвления терминала, а затем запускают execvp() в дочернем процессе именно на той команде и аргументах, которые ей даны. Оболочка не задействована, и аргументы, передаваемые st , отправляются в целевую программу в том виде, в каком она есть.

Вы все передали как один аргумент. Так что простой терминал на самом деле пытается запустить команду с именем, буквально, trans $(xclip -o) -t en; read trans $(xclip -o) -t en; read (если в одинарной кавычке или в результате изменения, каким бы ни был результат расширения, если вы используете двойные кавычки). Очевидно, у вас нет команды с таким именем.

Чтобы использовать командную строку оболочки – как у вас здесь с расширениями, встроенными командами оболочки и синтаксисом команд оболочки – вам нужно явно вызвать оболочку, чтобы понять это:

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

Это запускает st который запускает sh shell, который запускает короткий скрипт оболочки, который содержит ваши команды

Глядя на справочную страницу для 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, что этот переключатель предназначен только для выполнения одной команды и ничего более сложного, чем то, что вы пытаетесь выполнить.

Так что для этого вам нужно передать оболочку в качестве аргумента -e в st а затем передать свои команды в качестве вторичного набора аргументов в более мощную оболочку:

 $ st  -e sh -c '....' $ st  -e bash -c '....' 

Рекомендации

  • St Man Page