Эхо в файле возвращает Нет такого файла или каталога
Мне интересно, почему мой простой скрипт не работает:
#!/usr/bin/env bash
user_variable='$1'
echo "export USER_VAR=$user_variable" > ~$user_variable/.filename
Когда я запускаю скрипт, у меня появляется эта ошибка:
./script.sh admin: line 3: ~admin/.filename: No such file or directory
Конечно, каталог для ~ admin существует:
~ # cd ~admin
/share/homes/admin #
И если я тестирую этот вид команды непосредственно в командной строке, она работает:
# echo "test" > ~admin/.filetest
#
Так почему моя команда echo не работает в файле сценария?
Спасибо.
2 ответа
От bash(1)
:
Порядок расширений: расширение фигурных скобок, расширение тильды, расширение параметров, переменных и арифметики и подстановка команд (выполняется слева направо), разбиение слов и расширение имени пути.
То есть он расширяет тильду перед расширением переменной, поэтому не заменяет $user_variable
с $1
(что, я полагаю, является "admin
До тех пор, пока он не попытался и не смог обработать ~
- потому что он ищет пользователя с именем "$user_variable
", А не пользователь с именем"admin
".
Упорядочение расширений здесь не мешает вам использовать переменную в соответствии с вашим первоначальным намерением. Обычно eval может помочь, когда дело доходит до динамических команд.
eval "echo \" export USER_VAR = $ user_variable \ "> ~ $ user_variable /.filename"