OS X: Як отримати поточне розташування мережі всередині функції bash?


2

Мені потрібно використовувати поточне розташування мережі всередині bash script. Я спробував використовувати scselectкоманду, яка видає зірочку поруч із поточним розташуванням:

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

Це не працює:

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

завдяки *виводу, scselectщо розширюється до списку імен файлів у поточному каталозі.

Відповіді:


3

awk на допомогу.

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

Якщо вам подобається, ви також можете скористатися, sedщоб зняти парен.

$ scselect | awk '{if ($1=="*") print $3}' | sed 's/[()]//g'
Automatic

0

Ви можете просто втекти *з a \. Крім того, схоже scselect, щонайменше на Snow Leopard виводить визначені набори на stderr замість stdout, тому вам, ймовірно, потрібно перенаправити stderr на stdout:

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

0

Це:

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

Значить: запустіть команду scselect і перейдіть за *. * Automatic, що є невірним регулярним виразом. Зірочка - це модифікатор попереднього атома ("річ") у виразі, тому це не може бути першим.

Якщо ви хочете відповідати дійсній зірочці, вам доведеться уникати її за допомогою нахилу.

Spiff запропонував це, але для використаних подвійних лапок, які не передадуть зворотну косу рису, вам доведеться використовувати одиничні лапки або подвійну косу рису. Плутати ще? :)

Отже, це дало б:

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

Що означає, запустіть команду scselect, знайдіть рядок, що відповідає *. * Автоматично та виведіть його, а потім використовуйте це як аргументи команди 'test' (також відомий як '[').

Команда тесту не приймає рядок виводу з scselect як аргумент.

Що ви насправді маєте на увазі - це взагалі не використовувати команду тестування:

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

Але, як згадував Spiff, чомусь scselect відправляє свій результат на stderr not stdout.

Отже, тепер ви закінчите:

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

Що чудово працює, але все ж надсилає той рядок, який греп дає нам STDOUT, чого ми, мабуть, не хочемо у своєму виведенні, тому давайте виправити це:

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

І ... туди ти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.