Настройте легкий DNS-сервер на своем raspberry (я рекомендую dnsmasq
вместо «стандартного» сервера ISC BIND, потому что его проще настроить up для этой цели) и настройте его как DNS-сервер по умолчанию для любого устройства, подключенного к вашей локальной сети (скорее всего, в вашей конфигурации DHCP).
В конфигурации DNS укажите в своем домене локальный адрес 192.168.x.x, тем самым переопределив указатель глобального интернет-домена в вашей локальной сети. Настройте DNS для пересылки всех других запросов на соответствующий DNS-сервер за пределами вашей локальной сети (например, DNS вашего интернет-провайдера).
Это приведет к тому, что устройство LAN будет получать адрес локального сервера всякий раз, когда оно запрашивает ваш домен. Когда это устройство находится в пути, оно получит «настоящий» внешний IP-адрес от DNS-сервера за пределами вашей локальной сети.
read
объявляет переменные, а не читает их. Проще говоря, удалите $
из read
, и все готово.
if [ -z $1 ]
then
echo provide filenames
read FILENAMES
else
FILENAMES="$@"
fi
echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
cp $i $HOME
done
РЕДАКТИРОВАТЬ :Я вижу, что вы используете командуsource
(.
)для запуска скрипта.
[dmytro@oc1726036122 Desktop]$. totmp
Это может подойти для данного конкретного скрипта, но никогда не делайте этого для сложных скриптов. В противном случае вы загружаете любую переменную или функцию из этого скрипта в свою оболочку. Просто используйтеbash totmp
Команда read
принимает переменную, но вы уже ссылаетесь на значения переменной:
#correct syntax
read variable
#wrong syntax
read $variable
$variable
— это значение variable
, и в начале скрипта оно не установлено/пусто.
Проблема, которая, кажется, блокирует вас, заключается в том, что команда read
неверна, переданный ей аргумент должен быть именем переменной, поэтому его следует передавать без $
(, $
расширит содержимое переменной, которая в этот момент будет пустой, поэтому результатом будет read
без каких-либо имен переменных, переданных ему.)
read FILENAMES
Еще одна проблема с проверкой отсутствия первого аргумента строки команды -. Если его нет, то $1
превратится в ничто (, а не в пустую строку ), что может вызвать проблемы с командой [
, поскольку [ -z ]
на самом деле не предполагается допустимым, [ -z "" ]
- это то, что вы ожидаете проверить в этом случае. Короче говоря, вам нужно указать эту переменную:
if [ -z "$1" ]
Поскольку вы используете bash, вы также можете использовать [[... ]]
, что обычно лучше, так как это внутренняя команда (в этом случае эта команда должна работать без кавычек, но сохранение кавычек не повредит и выглядит неплохо.)
(П.С. :В этом скрипте так много всего неправильного, он настолько далек от лучших практик, что я действительно потрясен тем, что кто-то учит этому. К сожалению,кажется, что планка для обучения bash очень низкая, а руководства действительно сложны, пока вы действительно не поймете это хорошо, поэтому я не знаю, могу ли я дать лучшую рекомендацию о том, как правильно его изучить.)☹️