Como executar “source .bashrc” automaticamente depois de editar e salvá-lo?

2

É possível executar automaticamente "source .bashrc" sempre que editar o arquivo bashrc e salvá-lo?

    
por user1762571 03.06.2017 / 01:43

4 respostas

3

Uma maneira, como outra resposta aponta, seria fazer uma função que substitua a chamada do editor para .bashrc com um processo de duas etapas que

  1. abre seu editor no .bashrc
  2. fontes .bashrc

como:

vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }

Isso tem algumas deficiências:

  • exige que você lembre de digitar vibashrc toda vez que quiser que a origem ocorra
  • isso só aconteceria na janela atual do seu bash
  • tentaria originar .bashrc independentemente de ter feito alguma alteração

Outra opção seria conectar-se ao PROMPT_COMMAND do bash funcionalidade para fonte .bashrc em qualquer / todos bash shells sempre que ele ver que o arquivo .bashrc foi atualizado (e pouco antes do próximo prompt ser exibido).

Você deve adicionar o seguinte código ao seu arquivo .bashrc (ou estender qualquer funcionalidade PROMPT_COMMAND existente com ele):

prompt_command() {
  # initialize the timestamp, if it isn't already
  _bashrc_timestamp=${_bashrc_timestamp:-$(stat -c %Y "$HOME/.bashrc")}
  # if it's been modified, test and load it
  if [[ $(stat -c %Y "$HOME/.bashrc") -gt $_bashrc_timestamp ]]
  then
    # only load it if '-n' succeeds ...
    if $BASH -n "$HOME/.bashrc" >& /dev/null
    then
        source "$HOME/.bashrc"
    else
        printf "Error in $HOME/.bashrc; not sourcing it\n" >&2
    fi
    # ... but update the timestamp regardless
    _bashrc_timestamp=$(stat -c %Y "$HOME/.bashrc")
  fi
}

PROMPT_COMMAND='prompt_command'

Então, na próxima vez que você efetuar login, o bash carregará esta função e solicitará o hook, e toda vez que estiver prestes a exibir um prompt, ele verificará se $ HOME / .bashrc foi atualizado. Se tiver, será executada uma verificação rápida dos erros de sintaxe (o set -n opção), e se o arquivo estiver limpo, fonte.

Ele atualiza a variável timestamp interna, independentemente da verificação de sintaxe, para que não tente carregá-la até que o arquivo seja salvo / atualizado novamente.

    
por 03.06.2017 / 03:51
0

Talvez uma função de shell como:

nano .bashrc ; source .bashrc

Ou apenas execute esse comando?

    
por 03.06.2017 / 01:45
0

Você pode instruir o bash a reler .bashrc quando receber um sinal . Coloque a seguinte linha no seu .bashrc :

trap '. ~/.bashrc' USR1

Então, sempre que você tiver editado seu .bashrc , envie as instâncias interativas do bash para o sinal. (Não envie para scripts! Isso os mataria.) Não há uma maneira infalível de fazer isso, então há algum risco de matar um processo não relacionado. O seguinte snippet do bash se aproxima - ele procura o bash chamado sem argumento e com a entrada padrão proveniente de um terminal (ou qualquer outro dispositivo de caractere, mas na prática isso não é um problema):

ps -u "$(id -u)" -o pid= -o args= | while read -r pid args; do
  if [[ $args = bash || $args = */bin/bash ]]; then
    stdin="$(lsof -p"$pid" | sed -n '/^f0$/ { n; s/^n//p; q; }')"
    if [ -c "$stdin" ]; then
      kill -USR1 "$pid"
    fi
  fi
done

Como alternativa, para evitar a falta de confiabilidade da abordagem de sinal, você poderia fazer o bash reler .bashrc de sua própria violação. A desvantagem dessa abordagem é que ela relerá o arquivo mesmo se você acabou de salvá-lo com um erro de sintaxe ou um erro lógico (por exemplo, um loop infinito). O conteúdo da variável PROMPT_COMMAND é executado toda vez que o bash exibe um prompt, então coloque isso em .bashrc :

reread_bashrc () {
  if ((SECONDS > bashrc_last_read)); then
    . ~/.bashrc
    bashrc_last_read=$SECONDS
  fi
}
bashrc_last_read=$SECONDS
PROMPT_COMMAND="$PROMPT_COMMAND
reread_bashrc"

Uma bênção mista dessa abordagem é que ela não será acionada enquanto você digita um comando. Você tem que pelo menos pressionar Enter .

    
por 04.06.2017 / 02:17
0
edit_and_source () {
    local tmpfile=$(mktemp)
    trap 'rm -f "$tmpfile"' EXIT RETURN

    cp -p "$1" "$tmpfile"

    while true; do
        command "${EDITOR:-vi}" "$tmpfile"
        bash -n "$tmpfile" && break

        echo 'There were errors. Re-edit?' >&2
        read -p 'Yes/No/Force: '

        case "$REPLY" in
            [Yy]*) continue ;;
            [Ff]*) break    ;;
            *)     return   ;;
        esac
    done

    mv "$tmpfile" "$1"
}

Esta função bash permitirá que você edite o arquivo especificado usando o editor definido por $EDITOR (ou vi se não estiver definido) e, então, irá obtê-lo.

$ edit_and_source ~/.bashrc

Se o arquivo contiver erros após a edição, a função perguntará se você deseja editá-lo novamente:

/tmp/tmp.ETdo10orcg: line 4: syntax error near unexpected token '('
/tmp/tmp.ETdo10orcg: line 4: ' nt hn thnt();0'
There were errors. Re-edit?
Yes/No/Force: n

Responder "não" deixará o arquivo original intacto. Responder "force" (ou qualquer palavra que comece com "f") forçará a instalação do arquivo com bugs.

    
por 04.06.2017 / 08:48