Для начала вот скрипт, который я запускаю, чтобы получить оскорбительную строку:
# sed finds all sourced file paths from inputted file.
#
# while reads each match output from sed to $SOURCEFILE variable.
# Each should be a file path, or a variable that represents a file path.
# Any variables found should be expanded to the full path.
#
# echo and calls are used for demonstractive purposes only
# I intend to do something else with the path once it's expanded.
PATH_SOME_SCRIPT="/path/to/bash/script"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
"$SOURCEFILE"
$SOURCEFILE
done < <(cat $PATH_SOME_SCRIPT | sed -n -e "s/^\(source\|\.\|\$include\) //p")
Вы также можете использовать следующее, чтобы проверить это как фиктивные данные:
[ /path/to/bash/script ]
#!/bin/bash
source "$HOME/bash_file"
source "$GLOBAL_VAR_SCRIPT_PATH"
echo "No cow powers here"
Для команды tl;dr в основном цикл while
выдает следующее на фиктивных данных:
"$HOME/bash_file"
bash: "$HOME/bash_file": no such file or directory
bash: "$HOME/bash_file": no such file or directory
"$GLOBAL_VAR_SCRIPT_PATH"
"$GLOBAL_VAR_SCRIPT_PATH": command not found
"$GLOBAL_VAR_SCRIPT_PATH": command not found
Мой вопрос: можете ли вы правильно расширить переменную, например, напечатать «/home//bash_file» и «/expanded/variable/path»? Я также должен заявить, что хотя eval
работает, я не собираюсь его использовать из-за его потенциальные небезопасности.
Подсказка, что любое значение переменной, используемое в cat | sed
, будет доступно глобально, в том числе для вызывающего скрипта, а не потому, что скрипт не может вызвать значение переменной.
ПЕРВАЯ ПОПЫТКА РЕШЕНИЯ
Используя решение envsubst
Анубхавы:
SOMEVARIABLE="/home/nick/.some_path"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
envsubst <<< "$SOURCEFILE";
done < <(echo -e "\"\$SOMEVARIABLE\"\n\"$HOME/.another_file\"")
Это выводит следующее:
"$SOMEVARIABLE"
""
"/home/nick/.another_file"
"/home/nick/.another_file"
К сожалению, он не расширяет переменную! О, Боже :(
ВТОРАЯ ПОПЫТКА РЕШЕНИЯ
На основании первой попытки:
export SOMEVARIABLE="/home/nick/.some_path"
while read -r SOURCEFILE; do
echo "$SOURCEFILE"
envsubst <<< "$SOURCEFILE";
done < <(echo -e "\"\$SOMEVARIABLE\"\n\"$HOME/.another_file\"")
unset SOMEVARIABLE
который дает нужные нам результаты без eval
и без возни с глобальными переменными (в любом случае, слишком долго), ура!
Хорошие занявшие второе место были также предложены с использованием eval
(хотя и потенциально небезопасного), который можно найти в этом ответе и здесь (ссылка предоставлена расширенными комментариями Анубхавы).