OS X: Como obter o local atual da rede dentro de uma função bash?

2

Eu preciso usar o local de rede atual dentro de um script bash condicional. Eu tentei usar o comando scselect , que gera um asterisco ao lado do local atual:

~/ scselect 
Defined sets include: (* == current set)
   70209F72-5BE9-44D1-979E-A8BA25A317B4 (Office)
 * BDF51A74-6547-4747-BD21-30C51DA26CB1 (Automatic)

Isso não funciona:

#!/bin/bash
if [ 'scselect | grep "*.*Automatic"' ]; then
    ...
fi

devido ao * na saída de scselect que se expande na lista de nomes de arquivos no diretório atual.

    
por GJ. 06.08.2011 / 23:30

3 respostas

3

awk para o resgate.

$ scselect | awk '{if ($1=="*") print $3}'
(Automatic)

Se quiser, você também pode usar sed para remover os parênteses.

$ scselect | awk '{if ($1=="*") print $3}' | sed 's/[()]//g'
Automatic
    
por 07.08.2011 / 00:46
0

Você pode simplesmente escapar do * com um \ . Além disso, parece que scselect , pelo menos no Snow Leopard, envia os conjuntos definidos para stderr em vez de stdout, então você provavelmente precisará redirecionar stderr para stdout:

scselect 2>&1 | grep "\*.*Automatic"
    
por 07.08.2011 / 05:53
0

Isto:

if [ 'scselect | grep "*.*Automatic"' ]; then

Significa: execute o comando scselect e grep para *. * Automatic, que é uma expressão regular inválida. O asterisco é um modificador do átomo anterior ("coisa") na expressão, por isso não pode ser a primeira coisa.

Se você quiser corresponder a um asterisco real, terá que escapar com uma barra invertida.

Spiff sugeriu isso, mas usou aspas duplas que não passam a barra invertida, você tem que usar aspas simples ou uma barra invertida dupla. Confuso ainda? :)

Então, isso daria:

if [ 'scselect | grep '\*.*Automatic'' ]; then

O que significa, execute o comando scselect, localize a linha que corresponde a *. * Automatic e execute-a, então use-a como os argumentos para o comando 'test' (também conhecido como '[').

O comando de teste não usa uma linha de saída do scselect como argumento.

O que você realmente quer fazer é não usar o comando test:

if scselect | grep '\*.*Automatic'; then

Mas como Spiff mencionou, por algum motivo bobo, o scselect envia sua saída para stderr não stdout.

Então agora você acaba com:

if scselect 2>&1 | grep '\*.*Automatic'; then

O que funciona muito bem, mas ainda envia aquela linha que o grep está nos dando para STDOUT, o que provavelmente não queremos em nossa saída, então vamos corrigir isso:

if scselect 2>&1 | grep '\*.*Automatic' >/dev/null 2>&1; then

E ... lá vai você.

    
por 17.08.2011 / 09:09