2017-02-22 8 views
1

Я пишу скрипт bash для автоматизации процесса сборки. Мне нужно сохранить путь в файле plist настроек и получить его в сценарии оболочки, используя plistbuddy.

Ключ ниже указывает путь, где будут храниться архивы, папки на рабочем столе:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>archives_path</key> 
    <string>$HOME/Desktop/Archives/</string> 
</dict> 
</plist> 

В моем сценарии оболочки я доступа к ключу:

SETTINGS_PATH="path/to/plist/file" 

ARCHIVES=$(/usr/libexec/PlistBuddy -c "Print archives_path" "$SETTINGS_PATH") 
#outputs "$HOME/Desktop/Archives/" 

mkdir "$ARCHIVES/test/" 
#outputs "mkdir: $HOME/Desktop/Archives: No such file or directory" 

ARCHIVES вар не является расширяясь до /Users/*username*/Desktop/Archives/, как и следовало ожидать.

Я сделал тест, создавая вар с одной и той же строки:

ARCHIVES="$HOME/Desktop/Archives/" 

echo "$ARCHIVES" 
#expands to "/Users/*username*/Desktop/Archives/" 

mkdir "$ARCHIVES/test/" 
#creates the 'test' directory 

Поскольку этот сценарий будет запускаться под учетной записью пользователя, неизвестно, как я могу заставить $ HOME, чтобы расширить должным образом.

+0

Попробуйте 'mkdir' с опцией' -p'. – Cyrus

+0

@Cyrus 'mkdir -p $ ARCHIVES' создает на рабочем столе папку с именем' $ HOME', содержащую папки 'Desktop/Archives/test /'. – demosp

ответ

1

Ваш $ARCHIVE, указанный PlistBuddy содержит литерал $HOME.

Простой демо:

str='$HOME/tmp/somefile' 
echo "The HOME isn't expanded: [[$str]]" 

печатает:

The HOME isn't expanded: [[$HOME/tmp/somefile]] 

Вы можете использовать eval для расширения как:

expanded_str1=$(eval "echo $str") 
echo "The HOME is DANGEROUSLY expanded using eval: [[$expanded_str1]]" 

, который печатает

The HOME is DANGEROUSLY expanded using eval: [[/Users/jm/tmp/somefile]] 

Но использование eval опасно! Исчезновение любой строки, которая не совсем под вашим контролем, действительно опасно.

Таким образом, вам необходимо вручную заменить литературу $HOME на ее актуальность значение. Это может быть сделано со многими способами, например:

expanded_str2="${str/\$HOME/$HOME}" 
# or 
expanded_str2=$(echo "$str" | sed "s!\$HOME!$HOME!") 
# or 
expanded_str2=$(echo "$str" | perl -plE 's/\$(\w+)/$ENV{$1}/g') 
# or ... other ways... 

Использование

echo "$expanded_str2" 

отпечатки

/Users/jm/tmp/somefile 
Смежные вопросы