2017-02-22 1 views
1

В сценарии bash я хочу работать со значением, хранящимся в системе по умолчанию. Чтобы получить значение, я делаю:Возможно ли в bash работать с папкой, содержащей тильду (~) и пробелы?

defaults read my.domain my_key 
#returns "~/Dropbox (My Company)/" 

Когда я следующий в Баш скрипт, тильды (~) не получает вспученные (я удалил обработку из-за краткости ошибки):

my_key=$(defaults read my.domain my_key) 
echo $my_key 
#output: "~/Dropbox (My Company)/" 

в принципе, проблема демонстрируется следующим образом:

my_key='~/Dropbox (My Company)/' 
echo $my_key 

тильда не расширена, так как имя файла в кавычки (не уверен, если это работает точно так же, как это). Когда я хочу, чтобы заставить тильды, это жалобы о кронштейнах (-bash: syntax error near unexpected token '('):

eval my_key='~/Dropbox (My Company)/' 

На данный момент, я просто сохранить полный путь в системе по умолчанию (по умолчанию написать my.domain my_key -string «/ Users/xxx/Dropbox (Моя компания) "), поэтому мне не нужно расширение. Но я думаю, что он должен работать с расширением, пробелами и скобками.

Я ищу разумное решение.

+0

Соответствует ли '/ Users/xxx /' значению '$ HOME' для этого пользователя? – Inian

+1

Как '' 'получить в этом значении? Он не должен был использоваться в первую очередь. Это ярлык, специфичный для оболочки для имени пути, и не должен использоваться для * сохранения * имени пути. – chepner

+0

@ Иниан: да, это так. Я просто не хотел указывать свое имя пользователя в stackoverflow. – doekman

ответ

3

Я не знаю, если Баш работает по-разному на OS X, но это, кажется, способ расширить только тильды и держать остальные цитировал:

my_key_escaped=$(printf %q "$my_key") 
eval my_key_expanded=${my_key_escaped/#\\~/~} 

Это работает первым процитировать все (пробелы, тильда, доллары ...), а затем безоговорочный лидирующий \~, если он есть.

+0

+1 Хотя это правильно обрабатывает только простейшую форму расширения тильды (где тильда не сопровождается именем пользователя, как в '~ jsmith/bin'). – Leon

+1

Следующая функция будет обрабатывать и другие формы расширения тильды: 'expand_tilde() {local s =" $ (printf% q "$ 1") "; s = "$ {s/\\ ~/'~'}"; eval echo "$ s"; } ' – Leon

+0

@Leon: команда printf отлично работает на OS X. – doekman

-1

не работает правильно: С другой переполнения стека вопрос, я пришел в элегантный, хотя «Hacky», ответ:

my_key=$(cd "$my_key";pwd) 

Я думал, что я нашел простой ответ ... Если вы хотите просто, не используйте специальные символы в именах путей.

Я оставляю этот ответ как указатель, как не делать этого.

+1

Единственная проблема заключается в том, что она не работает, когда 'my_key' содержит' ~ '. – Leon

+0

Арг, ты прав. Я думал, что нашел простой ответ ... Если вы хотите просто, не используйте специальные символы в именах путей ;-) – doekman