Как проверить размер каталога, заданного пользователем в качестве аргумента?

0

Я хочу получить размер каталога, заданного пользователем в качестве аргумента. Пример:

read -p "Enter the directory" target

du -k $target

Если пользователь указывает путь как ~/Documents/dir, я получаю сообщение об ошибке:du: cannot access '~/Documents/dir': No such file or directory

Принимая во внимание, что если я дам команду как:

du -k ~/Documents/dir

Я получаю желаемый результат.

Почему я не могу использовать переменные вместе с командой du?

Анурааг Кхаре
источник
Попробовал попробовать запустить скрипт -x? Также, над какой папкой работает скрипт, и предоставляет ли пользователь полный путь или относительный путь?
Hennes
Пробовал также с -x, без помощи. Путь, указанный пользователем, такой же, как путь, указанный вместе с командой du, как и во втором случае. Папка, в которой выполняется скрипт, является другой.
Анурааг Кхаре
Код не выполняет расширение тильды . Решение не в использовании ~. Укажите путь, относительный или абсолютный, без использования ~. Например, вместо того ~/Documents/dir, чтобы писать /home/myself/Documents/dir.
John1024
1
Чтение параметров построчно, так что 1980 ... В наши дни вы используете параметры в командной строке или предоставляете пользовательский интерфейс. Вы также запрещаете пользователю использовать завершение оболочки для ввода имен файлов. Использование параметров командной строки проще!
ксеноид
В противном случае см stackoverflow.com/questions/3963716/...
xenoid

Ответы:

0

Он ~не раскрывается после того, как он был прочитан поверх оболочки, или когда он помещен в duкоманду. Вы можете заставить bash выполнить расширение с помощью следующего кода:

read -p "Enter the directory" target
target=${target/#\~/$HOME}
du -k "${target}"

Это ${target/#\~/$HOME}важная часть. Он заменяет ~содержимое HOMEпеременной среды.

Jonesinator
источник
Посмотрим, что произойдет, если пользователь введет имя каталога ~root/dir.
John1024