Вопрос Обновление файла ~ / .bashrc для скрипта


Я разрабатываю скрипт, который будет настраивать и настраивать среду ubuntu-desktop. Одним из изменений, которые он делает, является добавление функций и других ~/.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 но это не так. Гуглинг вокруг я нашел exec bash заменить source ~/.bashrc,

Новый выход:

./t.sh: line 10: test-func: command not found

Из моего понимания exec, он просто создает новую оболочку, отключающую скрипт; поэтому «контрольная точка» никогда не распечатывается.

Как я могу обновить ~/.bashrc и запустить обновления в том же скрипте?

Буду признателен за любую оказанную помощь.


4
2018-03-25 10:26


происхождения


и что, если вы попробуете случайный файл .txt вместо .bashrc? - Sergiy Kolodyazhnyy
@Serg Что вы подразумеваете под текстовым файлом? Цель использования ~/.bashrc заключается в возможности вызвать функцию. - Nelson
Вы пытались дать полный путь вместо ~ /? - Julen Larrucea
@ Нельсон увидит ответ Малте. Мое подозрение было именно тем, что он описывает - ~/.bashrc имеет способ обнаружения, если оболочка работает неинтерактивно (т. е. когда вы запускаете скрипт) и выйдет без выполнения ваших определений (это то, что происходит с файлом - он «выполняет» определения). Вам нужно будет иметь отдельный файл для определения ваших функций, если вы хотите, чтобы они были получены как изнутри ~/.bashrc И из сценария - Sergiy Kolodyazhnyy
Я не думаю, что это проблема, так как этот сценарий также $HOME вместо ~ но я все равно тестировал, и он делает то же самое - Nelson


ответы:


Собственно, ваш .bashrc Получается. Однако, .bashrc предназначен для чтения интерактивными оболочками. Среда, которая запускает скрипт, не является интерактивной.

В Ubuntu, .bashrc проверяет, что shell-сервер является интерактивным и в противном случае останавливает выполнение. Вы должны найти эту строку в начале:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Это заставляет ваш скрипт прекратить поиск файла перед тем, как он прочитает вашу функцию.

Вы можете просто прикрепить свою функцию к другому файлу, чем .bashrc и он должен работать нормально. Если вы настаиваете на использовании .bashrc, вы можете просто установить переменную PS1 к некоторому фиктивному значению в вашем скрипте перед поиском .bashrc,


4
2018-03-25 10:47



На самом деле, часто практикуются отдельные файлы для псевдонимов и определений функций. Хороший ответ - Sergiy Kolodyazhnyy
Я настаиваю на использовании ~/.bashrc потому что я хочу намереваться использовать функции в терминале, а также позже в упомянутом сценарии. Я просмотрел, а также ~/.bashrc файла, и этой строки кода нет. Просто чтобы убедиться, что я установил PS1=false в самой верхней части файла. Это не имело никакого эффекта. - Nelson
@Nelson Можете ли вы разместить свой .bashrc к Пастебину? - Malte Skoruppa
Чтобы переместить мои псевдонимы и функции в отдельный файл, я бы просто выделил отдельный файл в ~/.bashrc? - Nelson
Спасибо @MalteSkoruppa и @Serg за ваш очень полезный вклад! Я переместил все свои .bashrcдополнения к отдельному файлу из OCD с аккуратным кодом и файлом, и он решает мою проблему. Я могу создать источник, а затем вызвать .bash_functions файл в том же скрипте. - Nelson