Путь, сохраненный в plist, начиная с $HOME, не раскрывается в команде сценария bash

Я пишу 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 правильно расширяться.

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
Другие вопросы по тегам