Конвейерный код в 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
}
Проблема в том, что 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