Eu preciso transformar uma série de comandos reunidos em um alias em .bashrc

1
sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'

O comando acima, quando executado a partir do terminal, gera o endereço IP "interno" correto. Quando tento passar como alias como:

alias intip='sudo ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}''

Estou recebendo o seguinte erro:

alias: addr: | cut -d: -f2 | awk { not found
alias: print not found
alias: } not found

O que estou fazendo de errado aqui?

    
por Vaios Argiropoulos 28.06.2013 / 21:11

3 respostas

3

Uma questão de usar aspas duplas e aspas simples onde é importante:

alias lsa="ls -l | awk '{print \}' "
    
por 28.06.2013 / 21:19
3

O que você está fazendo de errado é usar um alias para algo que é mais complicado do que dar um nome mais curto a um comando ou passar parâmetros para um comando automaticamente. Use uma função e você não terá que se preocupar com citações.

intip () {
    /sbin/ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
}

Note que você não precisa de sudo aqui, ifconfig não precisa de privilégios quando você está apenas procurando. Mas em muitas distribuições você precisa fornecer o caminho completo, pois ifconfig geralmente não está no padrão PATH para usuários não-root.

A propósito, você pode fazer sua filtragem inteiramente no awk, mas fique à vontade para usar várias ferramentas se você estiver mais confortável assim. Aqui está uma maneira:

intip () {
    /sbin/ifconfig wlan0 | awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}'
}

Você pode facilmente tornar o nome da interface um parâmetro opcional da função.

intip () {
    /sbin/ifconfig "${1:-wlan0}" |
    awk 'sub(/^.*inet addr:/,"") {sub(/ .*/,""); print}'
}

Só para mostrar por que seu alias não funciona: você tem aspas simples para delimitar o alias e dentro do texto do alias. O intérprete não pode ler sua mente e ver quais foram feitos para serem quais. Veja Chamando bash de sh (dash) com comandos lidos de args, e "Cadeia entre aspas não terminada" / "EOF inesperado" para alguns casos de citações entre citações e Por que echo está ignorando meus caracteres de aspas? para saber como incluir efetivamente uma única citação em um único caractere string entre aspas digitando os quatro caracteres '\'' .

    
por 29.06.2013 / 01:43
2

Ou você pode instalar moreutils (pelo menos, se estiver disponível para sua distro) e usar ifdata .

$ ifdata -pa br0
172.16.1.244

Você usaria wlan0 em vez de br0, é claro.

    
por 28.06.2013 / 23:43