то, что вы пытаетесь сделать, невозможно. или лучше: как вы пытаетесь это сделать, невозможно.
ваша команда bash неверна. bash -s command
не выполняется command
. он просто сохраняет строку «команда» в переменной $1
и затем выводит вас на приглашение. вот почему скрипт на python кажется зависшим. то, что вы хотели сделать, это bash -c command
.
почему вы получаете .bashrc
? Разве не достаточно просто набрать .bash_aliases
?
даже если вы правильно поняли команду bash, изменения вступят в силу только в сеансе bash, запущенном с python. как только эта сессия bash закрыта, и ваш скрипт на python завершен, вы возвращаетесь к своей первоначальной сессии bash. все изменения в сеансе bash, запущенном с python, потеряны.
каждый раз, когда вы хотите что-то изменить в текущем сеансе bash, вы должны делать это внутри текущего сеанса bash. большинство команд, которые вы запускаете из bash (системные команды, сценарии python, даже сценарии bash), порождают другой процесс, и все, что вы делаете в этом другом процессе, не повлияет на ваш первый сеанс bash.
source
- это встроенная команда bash, которая позволяет вам выполнять команды внутри текущей сессии bash, вместо того, чтобы порождать другой процесс и запускать там команды. определение функции bash - это еще один способ выполнения команд внутри текущего сеанса bash.
см. этот ответ для получения дополнительной информации о поиске и исполнении.
что вы можете сделать, чтобы достичь того, что вы хотите
измените ваш скрипт на python, чтобы внести необходимые изменения в .bash_aliases
.
подготовить сценарий bash для запуска сценария python и затем получить исходный код .bash_aliases
.
#i am a bash script, but you have to source me, do not execute me.
modify_bash_aliases.py "$@"
source ~/.bash_aliases
добавьте псевдоним к вашему .bashrc
источнику этого скрипта
alias add_alias='source modify_bash_aliases.sh'
теперь, когда вы наберете add_alias some_alias
в приглашении bash, оно будет заменено на source modify_bash_aliases.sh
и затем выполнено. поскольку source
является встроенной функцией bash, команды внутри скрипта будут выполняться внутри текущей сессии bash. скрипт python по-прежнему будет выполняться в другом процессе, но последующая команда source
будет выполняться внутри текущего сеанса bash.
другой способ
измените ваш скрипт на python, чтобы внести необходимые изменения в .bash_aliases
.
подготовить функцию bash для запуска скрипта на python и затем получить исходный код .bash_aliases
.
add_alias() {
modify_bash_aliases.py "$@"
source ~/.bash_aliases
}
теперь вы можете вызывать функцию следующим образом: add_alias some_alias