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


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переменной среды.


Посмотрим, что произойдет, если пользователь введет имя каталога ~root/dir.
John1024
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.