Executar um comando e, em seguida, a substituição de parâmetros em uma linha

7
bash# hostname
host1.example.com

Eu só quero host1. Então:

SHORT_HOST=$(/bin/hostname)
SHORT_HOST=${SHORT_HOST%%.*}

Posso transformar isso em um forro único?  - ou - Qual é a melhor maneira de tornar $ SHORT_HOST readonly, mas ainda assim obter o hostname curto?

    
por Felipe Alvarez 02.11.2011 / 06:39

4 respostas

5

Se você não está limitado apenas às ferramentas do bash, talvez tente

SHORT_HOST=$(hostname | sed -e 's/\..*//')

ou

SHORT_HOST=$(hostname | cut -d. -f1)
    
por 02.11.2011 / 07:45
4

Se o seu ambiente suportar isso, você poderia simplesmente:

typeset -r SHORT_HOST="$(/bin/hostname -s)"
    
por 02.11.2011 / 07:49
3

Esta é apenas outra maneira de usar o comando awk :

/bin/hostname | awk -F'.' '{print $1}'

e se você precisar armazená-lo em uma variável SHORT_HOST, use o seguinte:

SHORT_HOST=$(/bin/hostname | awk -F'.' '{print $1}')
    
por 02.11.2011 / 09:07
2

Em shells que não sejam zsh, você precisa executar uma atribuição intermediária sempre que desejar executar várias transformações em um valor.

Claro, às vezes existem soluções alternativas, como executando um comando que produz o resultado desejado sem nenhum pós-processamento ou fazendo o pós-processamento através de um pipe através de uma ferramenta externa (a solução de pipe será mais lenta e corre mais risco de manchar novas linhas).

Se você quiser tornar a variável somente leitura, talvez seja mais fácil atribuir a uma variável temporária.

tmp=$(/bin/hostname)
typeset -r SHORT_HOST="${tmp%%.*}"

Zsh (mas não o ksh ou o bash) suporta substituições de parâmetros aninhados. Lá você pode escrever

typeset -r SHORT_HOST=${$(/bin/hostname)%%.*}
    
por 02.11.2011 / 22:07