Рядок префікса Bash з тильдою розгорнеться до домашнього каталогу


4

Я не можу зрозуміти, як префікс рядка (наприклад, "user1") за допомогою тильди (~), щоб створити ~user1та розширити його до домашнього каталогу user1.

Ось що я маю зараз:

USER="user1"
ls ~${USER}
ls: cannot access ~user1: No such file or directory

~user1не розширюється. Як я можу цього досягти?

редагувати

Це не працює:

$ cat test.sh
USER="user1"
ls $(~$USER)

$ sh -x test.sh
+ USER=user1
+ ~user1
test.sh: 1: ~user1: not found
+ ls
test.sh

Використання /home/user1- це не варіант?
тердон

Не використовуйте USER, це ваше ім'я. Натомість використовуйте великі регістри змінних.
ctrl-alt-delor

чому слід віддавати перевагу нижній регістр?
bernie

3
тому ви не перезаписуєте вбудовані змінні, такі як USER. USER містить ім'я поточного користувача, який виконує команду.
ctrl-alt-delor

1
так, але чи хочете ви їх вивчити, а потім слідкуйте за новими. З цієї причини прийнято мати всі локальні змінні в скриптах оболонки як малі регістри.
ctrl-alt-delor

Відповіді:


6

Якщо каталог вашого користувача не просто /home/user, ви можете використовувати evalу своєму сценарії ( джерело ):

USER_HOME=$(eval echo ~${USER})
echo ${USER_HOME}

Це працює. Тепер мені слід віддати перевагу evalчи bash -c?
bernie

По-друге, я думаю, що bash -c почне новий процес bash, тому він буде незначно повільнішим та більш ресурсомістким.
тердон

Досліджуючи це, я знайшов це посилання, яке пояснює, що відбувається і навіщо потрібен eval: fvue.nl/wiki/Bash:_Why_use_eval_with_variable_expansion%3F
bernie

3

Це загальний спосіб отримати баш для повторної оцінки, але використання eval може бути кращим, оскільки це не породить новий процес. (відлуння вбудовано в bash, тому не новий процес)

user="user1"
bash -c "ls ~${user}"

2-й спосіб не працює. дивіться мою
редакцію

Це працює. Тепер мені слід віддати перевагу evalчи bash -c?
bernie

eval, ймовірно, більш портативний, оскільки йому не байдуже, як звуть оболонку.
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.