Comandos Bash não encontrados após erro de sintaxe

2

Estou me deparando com um problema em que executar comandos bash comuns (por exemplo, ls, mv, rsync, vi) em um Ubuntu 14.04.5 LTS resulta em algo parecido com isto: %código%.

Quando eu ssh em recebo este erro (antes de executar qualquer comando no shell):

bash: rsync: command not found

Consegui corrigir o problema comentando essas linhas nos arquivos awk: cmd. line:1: //home/myuser/.pythonbrew/ {next} {print} awk: cmd. line:1: ^ syntax error e ~/.bash_profile relacionados à configuração do python & pythonbrew:

~/.bashrc

No entanto, essas linhas parecem não ser a causa raiz, já que esses arquivos não foram modificados por anos (e os comandos do bash pararam de funcionar nos últimos dias).

Pensamentos?

Conteúdo de export PATH=~/opt/python-2.7.3/bin:${PATH} export PYTHONPATH=~/opt/python-2.7.3/lib alias pb='pythonbrew' export PYTHONPATH=~/.pythonbrew/pythons/Python-2.7.3/lib [[ -s /home/myuser/.pythonbrew/etc/bashrc ]] && source /home/myuser/.pythonbrew/etc/bashrc

# settings
PATH_ROOT="$PYTHONBREW_ROOT"
if [ -z "${PATH_ROOT}" ] ; then
    PATH_ROOT="$HOME/.pythonbrew"
fi
PATH_ETC="$PATH_ROOT/etc"

PATH_HOME="$PYTHONBREW_HOME"
if [ -z "${PATH_HOME}" ] ; then
    PATH_HOME="$HOME/.pythonbrew"
fi
PATH_HOME_ETC="$PATH_HOME/etc"

# py file
PY_PYTHONBREW="$PATH_ROOT/bin/pythonbrew"

# functions
__pythonbrew_set_default()
{
    PATH_PYTHONBREW="$PATH_ROOT/bin"
    PATH_PYTHONBREW_LIB="$PATH_ROOT/lib"
}

__pythonbrew_set_path()
{
    PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')
    export PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW
    export PYTHONPATH=$PATH_PYTHONBREW_LIB
}

__pythonbrew_set_temp_path()
{
    if [[ -s "$PATH_HOME_ETC/temp" ]] ; then
        source "$PATH_HOME_ETC/temp"
        PATH_PYTHONBREW="$PATH_ROOT/bin:$PATH_PYTHONBREW_TEMP"
        PATH_PYTHONBREW_LIB="$PATH_PYTHONBREW_TEMP_LIB"
    else
        __pythonbrew_set_default
    fi
    __pythonbrew_set_path
}

__pythonbrew_set_current_path()
{
    if [[ -s "$PATH_HOME_ETC/current" ]] ; then
        source "$PATH_HOME_ETC/current"
        PATH_PYTHONBREW="$PATH_ROOT/bin:$PATH_PYTHONBREW_CURRENT"
        PATH_PYTHONBREW_LIB="$PATH_PYTHONBREW_CURRENT_LIB"
    else
        __pythonbrew_set_default
    fi
    __pythonbrew_set_path
}

__pythonbrew_reload()
{
    [[ -s "$PATH_ETC/bashrc" ]] && source "$PATH_ETC/bashrc"
}

__pythonbrew_use()
{
    [[ $? == 0 ]] && __pythonbrew_set_temp_path
}

__pythonbrew_switch()
{
    [[ $? == 0 ]] && __pythonbrew_set_current_path
}

__pythonbrew_off()
{
    [[ $? == 0 ]] && __pythonbrew_set_current_path
}

__pythonbrew_update()
{
    [[ $? == 0 ]] && __pythonbrew_reload
}

__pythonbrew_venv()
{
    if [[ $? == 0 ]] ; then
        if [[ -s "$PATH_HOME_ETC/venv.run" ]] ; then
            source "$PATH_HOME_ETC/venv.run"
            cat /dev/null > "$PATH_HOME_ETC/venv.run"
        fi
    fi
}

__pythonbrew_find_command()
{
    command_name=""
    for arg in "$@" ; do
        case $arg in
            --*) continue;;
            -*) continue;;
            *)
            command_name=$arg
            break
            ;;
        esac
    done
}

__pythonbrew_run()
{
    __pythonbrew_find_command "$@"
    "$pythonbrew" "$@"
    case $command_name in
        use) __pythonbrew_use "$@";;
        switch) __pythonbrew_switch "$@" ;;
        off) __pythonbrew_off "$@" ;;
        update) __pythonbrew_update "$@" ;;
        venv) __pythonbrew_venv "$@" ;;
    esac
    builtin hash -r
}

pythonbrew()
{
    pythonbrew=$PY_PYTHONBREW
    __pythonbrew_run "$@"
}

pybrew()
{
    pythonbrew "$@"
}

sudopybrew()
{
    pythonbrew="sudo PYTHONBREW_ROOT=$PATH_ROOT PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW $PY_PYTHONBREW"
    __pythonbrew_run "$@"
}

# main
__pythonbrew_set_current_path
    
por bjnsn 25.01.2018 / 21:10

3 respostas

2

Bem, eu posso lhe dizer o que está acontecendo, mas não tenho certeza porque está acontecendo. Você acabou de instalar uma nova versão do bash? Até onde eu posso ver, a causa tem que ser uma pequena mudança na forma como bash analisa certas substituições. BTW, eu também vou fazer algumas suposições sobre como consertá-lo, mas sem entender a causa raiz são apenas suposições.

O problema está ocorrendo na função __pythonbrew_set_path em ~ / .pythonbrew / etc / bashrc:

__pythonbrew_set_path()
{
    PATH_WITHOUT_PYTHONBREW=$(printf "$PATH" | awk -v RS=: -v ORS=: "/${PATH_ROOT//\//\/}/ {next} {print}" | sed -e 's#:$##')
    export PATH=$PATH_PYTHONBREW:$PATH_WITHOUT_PYTHONBREW
    export PYTHONPATH=$PATH_PYTHONBREW_LIB
}

O que é suposto que fazer é pegar o seu atual PATH ( printf "$PATH" ), remover todas as referências ao diretório brew do python (o comando awk ), remover um ":" perdido que foi adicionado ao final (o comando sed , armazene em PATH_WITHOUT_PYTHONBREW e defina um novo PATH contendo PATH_PYTHONBREW mais o antigo PATH limpo.

O que realmente está acontecendo é que há um erro de sintaxe no comando awk , portanto, não está gerando nada, portanto PATH_WITHOUT_PYTHONBREW acaba completamente em branco, então tudo, exceto PATH_PYTHONBREW , é removido de seu PATH . / p>

A razão pela qual o comando awk falha é que ${PATH_ROOT//\//\/} não está fazendo o que deveria. É suposto ter o PATH_ROOT (o caminho para o seu diretório python brew, "/home/myuser/.pythonbrew/") e adicionar fugas antes de cada / . Aqui está um exemplo de como deve operar:

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\/}"
\/home\/myuser\/.pythonbrew\/

Se você tentar isso no seu shell, eu acho que vai imprimir "/home/myuser/.pythonbrew/" (sem escapes). Você pode ver essa string (a versão sem escape) na mensagem de erro awk que você recebeu. A razão pela qual isso causa um erro awk é que awk usa / para marcar o início e o fim de um padrão de pesquisa; quando eles ocorrem no começo e no final e no meio (sem fugas), fica confuso.

Então, por que ${PATH_ROOT//\//\/} não é adicionado? É aqui que estou perplexo Meu melhor palpite é que é devido a uma mudança em exatamente como bash analisa a substituição aqui. Veja como o bash deve lê-lo: pegue o valor da variável ( PATH_ROOT ) e substitua todas as ocorrências ( // ) de um caractere de barra ( \/ - observe que ele escapou, portanto não é confundido com o final de o padrão) com ( / - este não escapou porque é o final do padrão) a string \/ ( \/ ).

Meu primeiro palpite seria que, por algum motivo, bash está removendo escapes antes de "/" na cadeia de substituição, como faz no padrão a ser substituído. Se for esse o caso, adicionar um escape extra à string de substituição deve corrigi-lo. Tente isso no seu shell:

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//\/}"
\/home\/myuser\/.pythonbrew\/

No meu faz o mesmo que o primeiro; se funcionar (adiciona escapes) no seu, adicione a barra invertida correspondente ao comando awk em ~ / .pythonbrew / etc / bashrc e você deve estar pronto. Se não, tente estes comandos e deixe-me saber o que o seu shell faz com eles (incluí a saída do meu shell para comparação):

$ PATH_ROOT="/home/myuser/.pythonbrew/"
$ printf "%s\n" "${PATH_ROOT//\//A}" "${PATH_ROOT////A}" "${PATH_ROOT//o/\/}" "${PATH_ROOT//o/\/}"
AhomeAmyuserA.pythonbrewA
AhomeAmyuserA.pythonbrewA
/h\/me/myuser/.pyth\/nbrew/
/h\/me/myuser/.pyth\/nbrew/
    
por 26.01.2018 / 06:46
0

Parece que você criou o script no Windows com a nova linha do Windows.

Por favor, salve o script como arquivo Unix ou faça um

dos2unix < script_dos.sh > script_unix.sh

    
por 25.01.2018 / 22:40
0

Parece que seu caminho está sendo burlado pelo comando de exportação do python. Tente colocar o material python no final.

MUDAR ISTO:

export PATH=~/opt/python-2.7.3/bin:${PATH}

PARA ISSO:

export PATH=$PATH:~/opt/python-2.7.3/bin

    
por 26.01.2018 / 01:05