TL; DR: Ви можете використовувати sudo -i
для запуску визначеної функції/root/.bashrc
(але не псевдонім), а також мати доступ до змінних, експортованих з цього файлу:
аргументи команди sudo -i
Псевдоніми там не працюють, але ви можете легко перетворити їх у функції, якщо хочете зробити їх доступними sudo -i
.
Читайте далі для повного аналізу та більш детальної інформації.
Тут є кілька проблем, деякі в тому, як працює судо, а деякі - як працює сам баш ...
За замовчуванням sudo
буде шукати лише команди та обійде оболонку, тому просто запуск sudo ll
працюватиме лише за наявності ll
виконуваного файлу в одному з каталогів у $PATH
. Отже, для використання псевдонімів (або функцій) вам потрібно переконатися, що оболонка викликається як частина процесу.
Один із способів - запустити щось на кшталт sudo sh
або sudo bash
, хоча сучасний sudo
(я тестую це на sudo 1.8.19p1), є варіанти -s
і -i
для цього.
Отож, одна спроба була б чимось на кшталт sudo -s ll
(що еквівалентно sudo bash -c 'll'
, якщо припустити, що це Ваш $SHELL
Bash, що, здається, випадок на основі rcfile
згаданих вами згаданих вами.) Але це також не працює, оскільки він запускає оболонку в неінтерактивний, режим без входу, який не читає жодного з його запуску файлів. Це по суті те саме, що якщо ви пишете скрипт оболонки і використовуєте #!/bin/bash
для його запуску. Псевдоніми (і функції), які ви маєте у своєму ~/.bashrc
, не будуть доступні з цього сценарію ...
Отже, наступний -i
варіант, який створює оболонку входу. Це більш перспективно, оскільки воно буде читати ваші файли запуску! І все ж sudo -i ll
(рівнозначно sudo bash -l -c 'll'
) все одно не вийде. Так як це можливо, враховуючи , що було прочитати визначення ll
псевдоніма?
Ну, наступне пояснення тут полягає в тому, що за замовчуванням bash не розширюватиме псевдоніми, за винятком випадків, коли оболонка інтерактивна ... Ця оболонка, запущена sudo -i
(або bash -l
), є оболонкою для входу , але все ще не є інтерактивною.
Наступним кроком є отримання інтерактивної оболонки, яка потім працює :
sudo bash -i -c 'll'
( Зрозуміло, що вхід і інтерактив також непогано, звичайно, bash -l -i -c ...
спрацюють.)
Інша альтернатива - продовжувати використовувати оболонку для входу (неінтерактивну), але попросіть її прямо розширити псевдоніми, щоб це також спрацювало:
sudo bash -l -O expand_aliases -c 'll'
(У випадку, коли bash був інтерактивним , не потрібна оболонка для входу , оскільки цього достатньо, щоб прочитати файли ініціалізації, але цей повинен -l
їх прочитати.)
Це досить довгі командні рядки ... І вони також вимагають, щоб ви цитували всю команду оболонки, тому, якщо ви називаєте псевдонім з аргументами, вам доведеться все це перетворити на рядок ... Так що це незграбний у використанні ...
Зауважте, що раніше я говорив про псевдоніми та функції ... Це було навмисно, оскільки функції насправді набагато зручніші. Вам не потрібно нічого особливого (наприклад, мати інтерактивну оболонку або встановити певний параметр) для виконання функцій на оболонці, доки ви не знайдете їх визначення.
Таким чином , якщо ви визначили ll
як функцію замість псевдоніма, ви зможете використовувати його безпосередньо SUDO в -i
ярлику:
sudo -i ll
І якщо у вас є довший командний рядок з аргументами, ви можете також передати їх безпосередньо тут:
sudo -i ll -C -R /etc
(Порівняти sudo bash -i -c 'll -C -R /etc'
.)
Функції також набагато гнучкіші і зазвичай простіші в обслуговуванні ... Перетворювати псевдонім у функцію зазвичай просто, єдиний застереження - завжди використовувати "$@"
там, де ви очікуєте, що зайві аргументи будуть прийняті (як правило, наприкінці псевдонім.)
Наприклад, цей псевдонім:
alias ll='ls $LS_OPTIONS -l'
Не вдалося перетворити цю функцію:
ll () {
ls $LS_OPTIONS -l "$@"
}
Вони для більшості цілей рівнозначні. І, як згадувалося раніше, функція повинна бути доступна безпосередньо з sudo -i
, так що це додатковий бонус.
Сподіваюся, ви знайдете цю відповідь та пояснення корисними!
/root/.bashrc
але насправді те, що йде Q, - це псевдоніми цього файлу - цього неможливо - unix.stackexchange.com/questions/1496/… .