Por que meu comando Curl não é executado?

1

Estou trabalhando em um script Bash que atualizará meu shell após uma nova instalação.

main()
{
    #
    #   By default we assume the terminal doesn't support colors
    #
    RED=""
    GREEN=""
    YELLOW=""
    BLUE=""
    BOLD=""
    NORMAL=""

    #
    #   Check  if we are connected to a terminal, and that terminal
    #   supports colors.
    #
    if which tput >/dev/null 2>&1; then
            ncolors=$(tput colors)
    fi

    #
    #   Set the colors if we can
    #
    if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then
        RED="$(tput setaf 1)"
        GREEN="$(tput setaf 2)"
        YELLOW="$(tput setaf 3)"
        BLUE="$(tput setaf 4)"
        BOLD="$(tput bold)"
        NORMAL="$(tput sgr0)"
    fi

    #
    #   Only enable exit-on-error after the non-critical colorization stuff,
    #   which may fail on systems lacking tput or terminfo
    #
    set -e

################################################################################

    printf "${YELLOW}"
    echo ''
    echo '    ____             __   ___  _____        __  '
    echo '   / __ )____ ______/ /_ |__ \/__  /  _____/ /_ '
    echo '  / __  / __ '/ ___/ __ \__/ /  / /  / ___/ __ \'
    echo ' / /_/ / /_/ (__  ) / / / __/  / /__(__  ) / / /'
    echo '/_____/\__,_/____/_/ /_/____/ /____/____/_/ /_/ '
    echo ''
    echo ''
    printf "${NORMAL}"

################################################################################

    #
    #   Find out if Zsh is already installed
    #
    CHECK_ZSH_INSTALLED=$(grep /zsh$ /etc/shells | wc -l)

    #
    #   Check to see if Zsh is already installed
    #
    if [ ! $CHECK_ZSH_INSTALLED -ge 1 ]; then
        sudo apt-get -y install zsh
    fi

    #
    #   Clean the memory
    #
    unset CHECK_ZSH_INSTALLED

################################################################################

    #
    #   Remove the previous config file, so we know we start from scratch
    #
    rm ~/.zshrc &&

    #
    #   Removing unnecessary Bash files
    #
    rm ~/.bash_history 2> /dev/null &&
    rm ~/.bash_logout 2> /dev/null &&
    rm ~/.bashrc 2> /dev/null &&
    rm ~/.bash_sessions 2> /dev/null &&
    rm ~/.sh_history 2> /dev/null &&

################################################################################

    #
    #   Download the configuration file
    #
    curl -fsSL "https://raw.githubusercontent.com/davidgatti/my-development-setup/master/08_Zsh_instead_of_Bash/zshrc" >> ~/.zshrc

    #
    #   Get the name of the logged in user
    #
    USER_NAME=$(whoami)

    #
    #   Get the home path for the logged in user
    #
    HOME_PATH=$(getent passwd $USER_NAME | cut -d: -f6)

    #
    #   Add a dynamic entry
    #
    echo 'zstyle :compinstall filename '$HOME_PATH/.zshrc'' >> ~/.zshrc
}

main

Eu executei Bash -x e todas as obras. Mas curl está longe de ser visto no traço resultante. O que eu tentei:

  • adicionando o curl em uma variável
  • usando eval
  • definindo " de 3 maneiras diferentes
  • etc.

Pergunta

Eu quero baixar um arquivo sem sinal curl dentro do script bash ao qual eu me vinculei, onde o script bash será executado da seguinte maneira:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/davidgatti/my-development-setup/master/08_Zsh_instead_of_Bash/install.sh)"

sh -x output

Se eu correr

sh -cx "$(curl -fsSL https://raw.githubusercontent.com/davidgatti/my-development-setup/master/08_Zsh_instead_of_Bash/install.sh)"

Esta é a saída.

+ main
+ RED=
+ GREEN=
+ YELLOW=
+ BLUE=
+ BOLD=
+ NORMAL=
+ which tput
+ tput colors
+ ncolors=256
+ [ -t 1 ]
+ [ -n 256 ]
+ [ 256 -ge 8 ]
+ tput setaf 1
+ RED=
+ tput setaf 2
+ GREEN=
+ tput setaf 3
+ YELLOW=
+ tput setaf 4
+ BLUE=
+ tput bold
+ BOLD=
+ tput sgr0
+ NORMAL=
+ set -e
+ printf
+ echo

+ echo     ____             __   ___  _____        __
    ____             __   ___  _____        __
+ echo    / __ )____ ______/ /_ |__ \/__  /  _____/ /_
   / __ )____ ______/ /_ |__ \/__  /  _____/ /_
+ echo   / __  / __ '/ ___/ __ \__/ /  / /  / ___/ __ \
  / __  / __ '/ ___/ __ \__/ /  / /  / ___/ __ \
+ echo  / /_/ / /_/ (__  ) / / / __/  / /__(__  ) / / /
 / /_/ / /_/ (__  ) / / / __/  / /__(__  ) / / /
+ echo /_____/\__,_/____/_/ /_/____/ /____/____/_/ /_/
/_____/\__,_/____/_/ /_/____/ /____/____/_/ /_/
+ echo

+ echo

+ printf
+ wc -l
+ grep /zsh$ /etc/shells
+ CHECK_ZSH_INSTALLED=2
+ [ ! 2 -ge 1 ]
+ unset CHECK_ZSH_INSTALLED
+ rm /home/admin/.zshrc

Eu pessoalmente não vejo curl sendo executado

    
por David Gatti 13.09.2017 / 20:10

2 respostas

7

Você não tem o arquivo ~/.zshrc , portanto rm ~/.zshrc sai com um valor diferente de zero. Como rm ~/.zshrc é o primeiro comando em uma longa lista de comandos encadeados com && , nenhum dos comandos a seguir é executado. curl é o último comando desta lista.

Solução # 1: use rm -f em vez de rm ou não termine suas linhas com && .

Além disso, você colocou set -e antes de seu banner brilhante. Isso faz com que seu script saia no primeiro comando que falha inesperadamente. Assim, remover && não será suficiente.

Solução 2: use rm -f ou encerre suas rm linhas com || true ou || :

Conclusão: altere todos os seus rm foo 2> /dev/null && para rm -f foo

    
por 13.09.2017 / 22:54
0

A sua pergunta não está clara sobre o que você está tendo problemas, mas para salvar um arquivo para o qual você tem um URL:

curl -o /path/to/output-file http://www.example.com/path/to/the/file

Para viver muito perigosamente e executar um script presumido em um bash shell:

bash -c "$(curl -fsSL http://www.example.com/path/to/script-that-quietly-installs-a-rootkit-for-you)"
    
por 13.09.2017 / 20:22