Проблема с вводом простого скрипта, который копирует файл в другой каталог

Как кто-то пытается узнать 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

, тестовый файл копируется без инцидентов, так что это, вероятно, нюанс переменной назначения, который я испортил, но я не могу понять.

Спасибо.

1
задан 21 December 2015 в 08:20

1 ответ

Попробуйте эти команды в вашем скрипте:

#!/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/.
4
ответ дан 23 May 2018 в 14:53
  • 1
    Это работает. Благодарю. Вы объяснили, что он ищет символ в ответе, но можете ли вы объяснить команды, которые это делают? Я не понимаю серию спинных и прямых косых черт, которые вы использовали при перераспределении переменной строки 3. Как эта серия косых переводов преобразуется в поиск ~? – mike3759 21 December 2015 в 12:16
  • 2
    @kos bash -c "echo $file_to_copy" это расширит значения переменных env из переменной file_to_copy, благодаря исправлению. – snoop 21 December 2015 в 13:15
  • 3
    @snoop, хотя это работает, это также имеет угрозу безопасности, так же как eval в моем ответе. Использование `sudo -i` также позволяет получить доступ к корневой оболочке. Обратите внимание на две звездочки – Sergiy Kolodyazhnyy 21 December 2015 в 13:28
  • 4
    @kos Здесь: paste.ubuntu.com/14126465 Произвольное выполнение команды с эхом и обратными окнами – Sergiy Kolodyazhnyy 21 December 2015 в 13:36
  • 5
    Эй, ребята ! Я немного играл с dirname и basename. Проверьте редактирование – Sergiy Kolodyazhnyy 21 December 2015 в 14:56

Другие вопросы по тегам:

Похожие вопросы: