5

Когда я sudo du -sh ~student1 я получаю ожидаемый результат (см. Скриншот). Однако, когда я пытаюсь использовать скрипт ниже:

#!/bin/bash

for user in "$@"; do
    sudo du -sh ~$user
done

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

(Я знаю, что могу сделать sudo du -sh student1 student2... , и что сценарий bash бесполезен, но я до сих пор не понимаю, почему он не работает.)

Я посмотрел на общее использование диска для конкретного пользователя, но это было не совсем то, что я искал.

3 ответа3

4

Оболочка выполняет один раз для расширения параметров, поэтому $user раскрывается, но предыдущий ~ не раскрывается. Чтобы разобрать строку ввода, используйте eval:

...
eval sudo du -sh ~$user
...
0
find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}'

это напечатает

Jsmith 928057466

та же функция

find . -user jsmith -type f -printf "%s\n" | awk '{t+=$1}END{print t}'

это будет печатать только

928057466

0

Как уже упоминалось @AFH, тильда (~) не расширена, и вы можете использовать eval для обработки этого ...

Или вы можете использовать getent чтобы получить домашний каталог пользователя:

$ getent passwd attie | cut -d: -f6
/home/attie

Таким образом, было бы легче обнаружить ошибку (а не загадочную проблему расширения переменной).

Вы даже можете использовать это для перечисления пользовательских каталогов:

$ getent passwd | cut -d: -f6 | grep -E '^/home/'
/home/attie
/home/bill

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .