Сценарий Bash для ExpressVPN

Конвейерный код в zshзапускает этот код в отдельном процессе. Этот процесс не имеет ваших интерактивных настроек, таких как псевдонимы и функции (, он не читает.zshrc)и не имеет переменных оболочки и другого состояния текущей оболочки. Состояние этого другого процесса, например текущего каталога, теряется при завершении этого процесса.

Чтобы выполнить код в текущем процессе оболочки, передайте его как аргумент (, а не как ввод )встроенной функции eval.

eval "$(<~/.zsh_history cut -d ';' -f 2 | sk --tac)"

Но для этого конкретного случая выбора записи истории есть и другой способ. Встроенная функцияfc. Следующая команда запускает функцию fcedit_skс одним аргументом — именем временного файла. При вызове функции файл содержит все записи истории.(${${(kn)history}[1]}— индекс самой старой записи, а -1— самая новая запись ). Когда функция возвращается, zsh выполняет все, что содержится в файле, как если бы вы ввели его в командной строке.

fc -e fcedit_sk ${${(kn)history}[1]} -1

Сделайте fcedit_skфункцией, которая вызывает skдля содержимого файла и записывает свои выходные данные обратно в файл. Я не знаю sk, поэтому я не знаю, есть ли способ проще, чем этот:

fcedit_sk () {
  local output
  output=$(sk --tac <$1)
  if (($?)); then
    echo >|$1 # Cancelled
  else
    print -lr -- $output >|$1
  fi
}

0
21.11.2020, 00:35
1 ответ

Проблема в том, что terminator -eбудет указывать команду, которая должна быть запущена в терминале (это не будет выполняться в оболочке -это означает, что после завершения команды нет причин держать терминал открытым ). А так как expressvpnне предоставляет оболочку, вы также не можете ничего напечатать во время ее работы.

Обычно вы используете terminator -e /bin/bash. Bash, вероятно, является вашей оболочкой по умолчанию и будет работать до тех пор, пока вы не наберете exit.

Если я правильно понял, вы в основном хотите запустить команду в терминале и запустить оболочку позже, так что это должно быть то, что должен запускать терминатор:yourcommand; /bin/bash

Так что это должно сработать:

terminator -e "command; /bin/bash"

При необходимости замените commandсвоей командой (, например.:expressvpn --help).


Если вы хотите добавить гораздо больше команд, вы можете вместо этого использовать скрипт:

terminator -e /path/to/my/script.sh

script.sh:

#!/bin/bash

#display help
expressvpn --help

#other commands

#start interactive shell (for manual input of commands)
/bin/bash
0
18.03.2021, 22:48

Теги

Похожие вопросы