OS X: Wie erhalte ich den aktuellen Netzwerkstandort innerhalb einer Bash-Funktion?

1064
GJ.

Ich muss den aktuellen Netzwerkstandort innerhalb eines Bash-Skripts verwenden. Ich habe es mit dem scselectBefehl versucht, der ein Sternchen neben dem aktuellen Ort ausgibt:

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

Das funktioniert nicht:

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

aufgrund der *in der Ausgabe scselectdavon erweitert sich die Dateinamenliste im aktuellen Verzeichnis.

2

3 Antworten auf die Frage

3
bahamat

awk zur Rettung.

$ scselect | awk '' (Automatic) 

Wenn Sie möchten, können Sie auch seddie Parens entfernen.

$ scselect | awk '' | sed 's/[()]//g' Automatic 
0
Spiff

Sie könnten einfach *mit einem entkommen \. Außerdem sieht es so aus scselect, als würden zumindest bei Snow Leopard die definierten Sätze an stderr statt an stdout ausgegeben. Daher müssen Sie stderr wahrscheinlich zu stdout umleiten:

scselect 2>&1 | grep "\*.*Automatic" 
0
ZILjr

Diese:

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

Bedeutet: Führen Sie den Befehl scselect aus und grep für *. * Automatic, was ein ungültiger regulärer Ausdruck ist. Das Sternchen ist ein Modifikator für das vorherige Atom ("Ding") im Ausdruck, daher kann es nicht das erste sein.

Wenn Sie ein tatsächliches Sternchen abgleichen möchten, müssen Sie es mit einem Backslash abschließen.

Spiff schlug dies vor, verwendete jedoch doppelte Anführungszeichen, die den Backslash nicht weitergeben würden, man muss einfache Anführungszeichen oder einen doppelten Backslash verwenden. Verwirrt noch? :)

Das würde also geben:

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

Führen Sie den Befehl scselect aus, suchen Sie die Zeile, die mit *. * Automatic übereinstimmt, und geben Sie sie aus. Verwenden Sie diese dann als Argumente für den Befehl 'test' (auch bekannt als '[').

Der Befehl test verwendet keine Ausgabezeile von scselect als Argument.

Was Sie wirklich tun wollen, ist, den Testbefehl überhaupt nicht zu verwenden:

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

Wie Spiff jedoch erwähnt hat, sendet scselect aus irgendeinem dummen Grund seine Ausgabe an stderr und nicht an stdout.

So endet es jetzt mit:

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

Was großartig funktioniert, aber dennoch die Zeile sendet, die grep uns zu STDOUT gibt, was wir wahrscheinlich in unserer Ausgabe nicht wollen, also korrigieren wir das:

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

Und ... los gehts.