Как кто-то пытается узнать bash, я делаю простые скрипты для тестирования различных команд. В следующем простом сценарии я экспериментирую с командой чтения.
#!/bin/bash
read -p "Enter a path to a file: " file_to_copy
cp $file_to_copy /tmp
Если пользователь вводит весь путь к тестовому файлу, например. / home / $ USER / test при появлении запроса, сценарий выполняется так, как ожидалось, и делает копию «теста» в каталоге / tmp. Однако, если пользователь вводит стенограмму ~ / test, терминал возвращает ошибку cp: не может stat '~ / test': нет такого файла или каталога. Почему команда cp не может найти эквивалентное представление пути к файлу при вводе?
Если я самостоятельно вхожу в терминал:
cp ~/test /tmp
, тестовый файл копируется без инцидентов, так что это, вероятно, нюанс переменной назначения, который я испортил, но я не могу понять.
Спасибо.
Попробуйте эти команды в вашем скрипте:
#!/bin/bash
read -p "Enter a path to a file: " file_to_copy
file_to_copy=$(bash -c "echo $file_to_copy")
file_to_copy=${file_to_copy/~\//$HOME\/}
cp "${file_to_copy}" /tmp
Объяснение:
Третья строка будет расширять значения переменной env, если они есть. Четвертая строка в приведенном выше коде попытается найти ~ в вашей переменной file_to_copy, и если она будет найдена, она заменит путь $HOME. И \/ здесь \ - символ escape-последовательности обратной косой черты для /, так как мы хотим заменить ~/ на $HOME/.