Я разрабатываю сценарий, который настроит и установит настольную среду человечности. Одно из изменений, которые это вносит, добавляет функции и другие вещи к ~/.bashrc
файл. Позже в сценарии, я должен вызвать одну из функций, добавленных к ~/.bashrc
но я добираюсь command not found
ошибка. Вот сценарий в качестве примера:
# t.sh
#!/bin/bash
text='test-func() { echo It works!; }'
echo "$text" >> ~/.bashrc
source ~/.bashrc
test-func
echo checkpoint
Вывод:
./t.sh: line 10: test-func: command not found
checkpoint
Я принял определение источника ~/.bashrc
обновил бы оболочку, разрешающую мне звонить test-func
но это не делает. При поиске с помощью Google вокруг я нашел exec bash
заменять source ~/.bashrc
.
Новый вывод:
./t.sh: line 10: test-func: command not found
От моего понимания exec
, это просто создает новую оболочку, отключающую сценарий; поэтому "контрольная точка" никогда не распечатывается.
Как я могу обновить ~/.bashrc
и выполненный обновления в том же сценарии?
Любая справка очень ценится.
На самом деле, Ваш .bashrc
действительно становится полученным. Однако .bashrc
предназначается, чтобы быть считанным интерактивными оболочками. Оболочка, которая запускает скрипт, не является интерактивной.
В Ubuntu, .bashrc
проверки, что оболочка, получающая его, является интерактивной, и иначе останавливает выполнение. Необходимо найти эту строку к началу:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Это заставляет Ваш сценарий прекращать получать файл, прежде чем он считает Вашу функцию.
можно просто присоединить функцию к другому файлу, чем .bashrc
, и это должно хорошо работать. Если Вы настаиваете на том, чтобы использовать .bashrc
, Вы могли бы просто установить переменную PS1
на некоторое фиктивное значение в Вашем сценарии прежде, чем получить .bashrc
.