OS X: как получить текущее сетевое расположение внутри функции bash?
Мне нужно использовать текущее сетевое расположение внутри сценария Bash условно. Я пытался использовать 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
Это:
if [ `scselect | grep "*.*Automatic"` ]; then
Означает: запустите команду scselect и grep для *.*Automatic, что является недопустимым регулярным выражением. Звездочка является модификатором предыдущего атома ("вещи") в выражении, поэтому она не может быть первой вещью.
Если вы хотите сопоставить настоящую звездочку, вы должны избежать обратной косой черты.
Спифф предложил это, но использовал двойные кавычки, которые не пропускают обратную косую черту, вы должны использовать одинарные кавычки или двойную обратную косую черту. Смущены еще?:)
Так что бы дать:
if [ `scselect | grep '\*.*Automatic'` ]; then
Это означает, что выполните команду scselect, найдите строку, соответствующую *.*Automatic, и выведите ее, а затем используйте ее в качестве аргументов команды test (также известной как "[").
Команда test не принимает строку вывода из scselect в качестве аргумента.
Что вы действительно хотите сделать, так это вообще не использовать тестовую команду:
if scselect | grep '\*.*Automatic'; then
Но, как упоминал Спифф, по какой-то глупой причине scselect отправляет свой вывод в stderr, а не в stdout.
Итак, теперь вы в конечном итоге:
if scselect 2>&1 | grep '\*.*Automatic'; then
Это прекрасно работает, но все же отправляет строку, которую grep передает нам в STDOUT, что, вероятно, нам не нужно в нашем выводе, поэтому давайте исправим это:
if scselect 2>&1 | grep '\*.*Automatic' >/dev/null 2>&1; then
И... вот, пожалуйста.
Вы могли бы просто избежать *
с \
, Кроме того, это выглядит как scselect
По крайней мере на Snow Leopard выводит определенные наборы в stderr вместо stdout, поэтому вам, вероятно, нужно перенаправить stderr в stdout:
scselect 2>&1 | grep "\*.*Automatic"