Я пытаюсь написать скрипт bash, который открывает новое окно терминала gnome и запускает псевдонимную команду. Я видел, что вместо использования псевдонимов правильным способом является использование функции. Я пробовал оба подхода, но не могу заставить их работать, так как получаю ошибку, что команда не распознана.
Вот что у меня есть.
#!/bin/bash
# Cluster related functions
function gateway () {
ssh user@something -t ssh gateway
}
gnome-terminal --window-with-profile=Bash -- bash -c "gateway; bash;"
Я получаю следующую ошибку:
bash: gateway: command not found
решение1
Самое простое решение — экспортировать функцию перед вызовом gnome-terminal
:
export -f gateway
Примечания:
Экспортировать псевдонимы нельзя.
Экспорт функций не является переносимой функцией. Она будет работать с
bash
поbash
.Это будет работать, если новый
bash
является потомком старогоbash
(где функция была экспортирована). Например, еслиgnome-terminal
наследует от старогоbash
, а новыйbash
наследует отgnome-terminal
. Это происходит, когда старыйbash
запускается в терминале, который не являетсяgnome-terminal
.Мои тесты показывают, что если
gnome-terminal
запускается изнутриgnome-terminal
(то есть среда содержитGNOME_TERMINAL_*
переменные), то новыйgnome-terminal
процесс делегирует задачу уже запущенномуgnome-terminal
и завершается. Естественное наследование среды новымbash
не может произойти, тем не менее новыйgnome-terminal
процесс достаточно умен, чтобы сообщать не только команду, но и среду. Таким образом, новый процессbash
внутри старогоgnome-terminal
ведет себя как потомок старогоbash
, экспортированная функция работает. Протестировано сgnome-terminal
3.28.2.